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

rou*_*ter 7 c++ bit-manipulation bit-shift

请考虑以下示例:

第一个案例:

short x=255;
x = (x<<8)>>8;
cout<<x<<endl;
Run Code Online (Sandbox Code Playgroud)

第二种情况:

short x=255;
x = x<<8;
x = x>>8;
cout<<x<<endl;
Run Code Online (Sandbox Code Playgroud)

第一种情况下的输出是255,而第二种情况下的输出是-1.-1因为输出确实有意义,因为cpp进行算术右移.以下是获取-1作为输出的x的中间值.

x: 0000 0000 1111 1111  
x<<8:1111 1111 0000 0000 
x>>8:1111 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*hik 12

差异是两个因素的结果.

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

  2. 第二个因素是二进制补码算法.

在你的第一个例子中,该short值自然地被提升为a int,至少是32位,因此左转和右转在a上运行int,然后转换回a short.

在第二个示例中,在第一个左移位运算之后,结果值再次转换回a short,并且由于二进制补码运算,它最终为负值.右移最终符号扩展负值,最终结果为-1.