我使用的编程语言是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相同。
我想知道为什么会出现这种情况。谢谢。
stdint.h
中提供了该类型,则标准保证(uint16_t)-1
会产生0xFFFF
。当然,如果是你自己的 typedef,就没有任何保证了。没有歧义,固定宽度类型要求没有填充位,因此它甚至不仅限于值位(好吧,因为在uintN_t
中只有值位,所以它确实是)。 - Daniel Fischer