当我们对8位数执行算术运算时,它们被提升为整数。下面有代码片段。
unsigned char startTime=7;
unsigned char endTime=5;
unsigned char diff = endTime-startTime;
我知道,在RHS中,两者都被提升为整数,因此结果是-2,最后的结果是254。我想知道编译器是如何做到这一点的。这是我的感受,但不确定。编译器将两者提升为整数。为结果创建临时整数变量。执行算术运算。结果5-7 = 0xFFFF FFFF FFFF FFFE。现在,只分配8位0xFE到LHS,所有较高的3个字节被剥离。因此,如果我们打印它,我们就会看到254。
发布于 2019-09-01 15:44:19
正如您注意到的,startTime
和endTime
被提升为int
,endTime-startTime
的结果是−2。C标准根据结果的值描述这种行为,即−2。它没有用编码结果的位来描述该行为;它不要求用位111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
在许多C实现中,基本上所有常见的现代实现,这两种补码系统都用于有符号整数,其中−2的32位表示形式是11111111111111111111111111111111111111111110。但C标准也允许使用补语(其中−2为111111111111111111111111111101)或符号级(−2为10000000000000000000000000000010)。
无论使用哪个系统,将unsigned char
2转换为8位unsigned char
的结果是254个.(C允许unsigned char
大于8位,但这个答案并不能解决这个问题。)这是因为C标准指定将整数值转换为unsigned char
的结果是unsigned char
类型域中的值,该值是通过反复添加或减去UCHAR_MAX+1
获得的。也就是说,它是被转换为模块256的值。对于−2,我们有−2 + 256 = 254,所以C标准要求的结果是254。
因为这个结果是C标准要求的,无论是使用两个补码,一个补码,还是符号和大小,C编译器(或整个C实现)负责做任何必要的事情来获得这个结果。当使用两个补码时,编译器所要做的就是将int
表示的低八位作为unsigned char
表示的位。这也是今天人们青睐两人补语的原因之一。如果C实现使用的是一个人的补码或符号大小,那么它将负责做任何必要的工作,将int
2−值转换为254个unsigned char
值。
https://stackoverflow.com/questions/57747189
复制相似问题