为什么组合uint8_t的两个class次产生不同的结果?
有人可以解释一下原因:
x = x <> 1;
和:
x = (x <> 1;
在C中产生不同的答案? x
是* uint8_t *类型(无符号1字节长整数)。 例如,当我在第一种情况下将其传递128 (10000000)
,它返回0
(正如预期的那样,最高位丢失)但在第二种情况下它返回原始128
。 这是为什么? 我希望这些表达式是等价的吗?
这是由于整数提升,在两种情况下,逐位移位的操作数都将被提升为int 。 在第二种情况:
x = (x << 1) >> 1;
x << 1
的结果将是一个int ,因此移位的位将被保留,并可作为int使用 ,以便将其再次移回。 在第一种情况下:
x = x << 1; x = x >> 1;
当您分配回x
您将丢失额外的位。 从草案C99标准部分6.5.7 Bit-wise shift operators
可以看出:
对每个操作数执行整数提升。
第6.3.1.1
节布尔,字符和整数第2节中介绍了整数提升,其中说明:
如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销。 48)
最后一部分为什么从int值256
到uint8_t的转换给我们0
? 第6.3.1.3
节“ 转换”部分下的有符号和无符号整数表示转换,并说:
否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。 49)
所以我们有256 - (255+1)
,即0
。
当您进行bithift时,结果将提升为int
。 在第一个示例中,每次都将int转换回uint8_t,并丢失中间数据。 但是在第二个例子中,当你转回时你会保留int结果。