gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:19:49 33 4
gpt4 key购买 nike

考虑以下示例:

第一种情况:

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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com