发布网友 发布时间:2023-10-16 08:24
共4个回答
热心网友 时间:2024-08-02 17:21
先说结论:
对一个正数加上2147483647 + 1后得到的是这个数的相反数的原码,而不是负数的补码。
对一个负数加上2147483647 + 1后得到的是无意义的数字。
c语言验证如下:
输出值:
2147483642
(结果为原码,由于c语言采用的补码,所以输出的是乱的)
理论论证如下:
将2147483647转换为二进制后:
发现有31个1,再+1后就是1后面31个0.也就是x=10000000000.......0000000(一共有31个0)。
从此猜测出你的变量为32位有符号int类型。其中最高位是符号位。
假设
x=2147483647 + 1
一个32位int加上x后最高位1变成0,0变成1(若有进位,则会发生溢出丢弃)。相当于对最高位(也就是符号位)取反。
也就是取相反数的操作。而且没有补码的操作。
若原始数据为负数,因为负数内存存放的本来就是补码,若仅仅改变符号位,则变成正数,但是正数c语言认为补码就是原码,不会将补码转换为原码,故输出为乱码。
热心网友 时间:2024-08-02 17:18
2147483647加上1好像是0x80000000吧 这正好是负数的符号位 效果类似于tWo(-i)热心网友 时间:2024-08-02 17:18
其实说简单点,+1的原因就是为了有符号数多出一个数的编码,并且消除了+0与-0的表示。热心网友 时间:2024-08-02 17:19
求补码不就是按位求反再加一,2³¹- 1 = 2147483647,一个负数加上它不就是取反吗
详细见下图,望采纳哦~