考虑以下示例:
第一种情况:
short x=255;
x = (x<<8)>>8;
cout<<x<<endl;
第二种情况:
short x=255;
x = x<<8;
x = x>>8;
cout<<x<<endl;
第一种情况的输出是 255,而第二种情况是 -1。 -1 因为输出确实有意义,因为 cpp 进行算术右移。这里是 x 的中间值,以获得 -1 作为输出。
x: 0000 0000 1111 1111
x<<8:1111 1111 0000 0000
x>>8:1111 1111 1111 1111
为什么在第一种情况下没有发生相同的机制?
最佳答案
差异是由两个因素造成的。
C++ 标准没有指定整数类型的最大值。该标准仅规定了每种整数类型的最小大小。在您的平台上,
short
是 16 位值,int
s 至少是 32 位值。第二个因素是two's complement算术。
在您的第一个示例中,short
值自然提升为 int
,它至少为 32 位,因此左右移位操作 int
,在转换回 short
之前。
在您的第二个示例中,在第一次左移操作之后,结果值再次转换回 short
,并且由于二进制补码运算,它最终为负值。右移最终对负值进行符号扩展,导致最终结果为 -1。
关于c++ - 为什么在同一条语句中左移和右移会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225516/