c++ - 为什么在同一条语句中左移和右移会产生不同的结果?

标签 c++ bit-manipulation bit-shift

考虑以下示例:

第一种情况:

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

为什么在第一种情况下没有发生相同的机制?

最佳答案

差异是由两个因素造成的。

  1. C++ 标准没有指定整数类型的最大值。该标准仅规定了每种整数类型的最小大小。在您的平台上,short 是 16 位值,ints 至少是 32 位值。

  2. 第二个因素是two's complement算术。

在您的第一个示例中,short 值自然提升为 int,它至少为 32 位,因此左右移位操作 int,在转换回 short 之前。

在您的第二个示例中,在第一次左移操作之后,结果值再次转换回 short,并且由于二进制补码运算,它最终为负值。右移最终对负值进行符号扩展,导致最终结果为 -1。

关于c++ - 为什么在同一条语句中左移和右移会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225516/

相关文章:

C++ : Using an array in a nested class definition (OOP)

c++ - 如何找到在 c++ main 之前调用的代码函数

algorithm - 通过按位或生成想要的数字

C中将2个字节组合成一个短整型

c++ - 为什么在 C++ 中声明一个全局数组时,它可以给出的大小比在 main 中声明的要大

c++ - 类型转换和检查是 vector 中存在的实例

c - if (y & (y = 2) 那么如何处理这个if条件

python-2.7 - Python2 在位操作方面遇到问题

c - 如何使用使用 128 位二进制和 4 位多项式模的 C 编写模块化运算?

java 以偏移量和长度从 byte 到 int 传输位