>n),(-6ren">
gpt4 book ai didi

c - x=0x80000000时~(x-1)和~x+1的区别

转载 作者:太空狗 更新时间:2023-10-29 17:03:43 31 4
gpt4 key购买 nike

我使用的语言是C。x和n的类型是int。

我有一行代码如下

  printf("x=%x,n=%d,first=%x,second=%x\n",x,n,((~(x+0xffffffff))>>n),((~x+1)>>n));

它显示了x,n的值和将x的补数移动n位的两种方法。当x=0x80000000,~(x+0xffffffff)=0x8000000,~x+1=0x80000000时,将这两个移动n位,结果不同。

顺便说一句,如果我将 0xffffffff 更改为 ~1+1(这意味着 ~(x+(~1+1)),结果与 ~x+1 相同

我想知道为什么会这样。谢谢。

最佳答案

Pavan Manjunath 现在已删除的答案对一个案例有正确答案,假设 int和往常一样是 32 位类型。整型常量

0xffffffff

的值为 2^32 - 1这不能用 int 表示, 但它可以表示为 unsigned int .所以它的类型是unsigned int (6.4.4.1)。因此 x转换为 unsigned int对于添加,和

((~(x+0xffffffff))>>n)

评估为

((~(0x80000000u + 0xffffffffu)) >> n)
((~0x7fffffffu) >> n)
(0x80000000u >> n)

值为 2^(31-n)如果0 <= n < 32 (如果 n 超出该范围,则为未定义行为)。

对于另一种情况,ouah 的回答是正确的,当 x = 0x80000000是一个 int , ~0x8000000 = 0x7fffffff = INT_MAXINT_MAX + 1是有符号整数溢出的未定义行为。

不过,一个常见的行为是回绕,然后加法的结果就是有符号整数0x80000000。负整数的右移是实现定义的行为(6.5.7)。 Common 是带符号扩展的移位,这将产生结果 -2^(31-n) ,然后被解释为 unsigned int值为 2^32 - 2^(31-n)通过 printf转换说明符 %x .

关于c - x=0x80000000时~(x-1)和~x+1的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10882423/

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