关于0x80000000为什么等于-2147483648和负数在内存上储存的问题
2017-12-05 10:38
901 查看
1·先说明负数怎么储存
(1)十进制负数是以其补码储存在内存上。
验证:求-8在内存上以二进制形式1的个数
思路是:拿变量,令值为1,与-8的二进制码的每一位做与运算,若与运算结果为1,则该位为1。
代码:
[cpp] view
plain copy
int NumberOf1(int n) {
int count = 0;
un
d9ef
signed int value = 1;
while (value != 0) {
if (value&n) {
count++;
}
value = value << 1; //左移右边补0,当移完32为value为0.
}
return count;
}
结论:
输入-8,结果为29。
在32位系统上,-8的储存
-8的储存是以-8的补码,储存在内存上。
-8的原码 1000 0000 0000 0000 0000 0000 0000 1000
取反 由于第一位是符号位 不用改变 得:1111 1111 1111 1111 1111 1111 1111 0111
补码=反码+1 得::1111 1111 1111 1111 1111 1111 1111 1000
得到1的数量正好为29,所以-8的补码就是-8储存在内存上的二进制码
(2)但是在十六进制,负数在内存中储存的是原码
验证:
对int test = 0x80000001 (对应十进制为-1) 检查其内存上的1的个数,发现只有2个1
故内存上原码为 1000 0000 0000 0000 0000 0000 0000 0001.
对十六进制的-8也是2个1
(3)我们来看看0x80000000的输出
0x80000000 的二进制位
原码 1000 0000 0000 0000 0000 0000 0000 0000
若最高位为符号位,则为-0,可是输出int i = 0x80000000 发现i= -(2^31)
原因是在十六进制中负数的二进制原码的最高位是符号位,后面的31位为序号位,不是值位。1后面的000 0000 0000 0000 0000 0000 0000 0000,表示序号1,表示负数中,从小到大的第一位。
由于int的最小值为-2^31,排在负数从小到大的序号1,所以int i = 0x80000000 输出为
-(2^31)
我们来看看0xFFFFFFFF
原码 1111 1111 1111 1111 1111 1111 1111 1111
最高位为1 ,为负数,序号位为第(2^31)-1位 (111 1111 1111 1111 1111 1111 1111 1111=(2^31-1) 所以0xFFFFFFFF为负数从小到大 第2^31-1位 ,即
-2^31+2^31-1= -1
输出int i = 0xFFFFFFFF 为 -1 符合
(4)十进制的补码也符合 符号位+序号位的原则
就拿-8来做例子:
-8的补码:1111 1111 1111 1111 1111 1111 1111 1000 可以看出最高位为1 序号位为第2^(31)-8位,(111 1111 1111 1111 1111 1111 1111 1000 = 2^(31)-8 )
则该补码表示的值为2^31- 2^(31)-8 = -8 符合
花费了2~3个小时去查阅相关内容,发现,目前较少相关信息,总结了一下发在这,是对自己学习成果的尊重,同时也希望对大家有点用。
觉得写得不错的点个赞,留个言。欢迎指正
------------------------------------------------------------------------
相关知识点补充:
十六进制用最高位作为符号位,1位负数,0为正数。
负数的位右移运算:
原则:若右移的数字为负值,则向右移动N位同时N个1补充在左边
若为正值,则以N个0补充在左边
(1)十进制负数是以其补码储存在内存上。
验证:求-8在内存上以二进制形式1的个数
思路是:拿变量,令值为1,与-8的二进制码的每一位做与运算,若与运算结果为1,则该位为1。
代码:
[cpp] view
plain copy
int NumberOf1(int n) {
int count = 0;
un
d9ef
signed int value = 1;
while (value != 0) {
if (value&n) {
count++;
}
value = value << 1; //左移右边补0,当移完32为value为0.
}
return count;
}
结论:
输入-8,结果为29。
在32位系统上,-8的储存
-8的储存是以-8的补码,储存在内存上。
-8的原码 1000 0000 0000 0000 0000 0000 0000 1000
取反 由于第一位是符号位 不用改变 得:1111 1111 1111 1111 1111 1111 1111 0111
补码=反码+1 得::1111 1111 1111 1111 1111 1111 1111 1000
得到1的数量正好为29,所以-8的补码就是-8储存在内存上的二进制码
(2)但是在十六进制,负数在内存中储存的是原码
验证:
对int test = 0x80000001 (对应十进制为-1) 检查其内存上的1的个数,发现只有2个1
故内存上原码为 1000 0000 0000 0000 0000 0000 0000 0001.
对十六进制的-8也是2个1
(3)我们来看看0x80000000的输出
0x80000000 的二进制位
原码 1000 0000 0000 0000 0000 0000 0000 0000
若最高位为符号位,则为-0,可是输出int i = 0x80000000 发现i= -(2^31)
原因是在十六进制中负数的二进制原码的最高位是符号位,后面的31位为序号位,不是值位。1后面的000 0000 0000 0000 0000 0000 0000 0000,表示序号1,表示负数中,从小到大的第一位。
由于int的最小值为-2^31,排在负数从小到大的序号1,所以int i = 0x80000000 输出为
-(2^31)
我们来看看0xFFFFFFFF
原码 1111 1111 1111 1111 1111 1111 1111 1111
最高位为1 ,为负数,序号位为第(2^31)-1位 (111 1111 1111 1111 1111 1111 1111 1111=(2^31-1) 所以0xFFFFFFFF为负数从小到大 第2^31-1位 ,即
-2^31+2^31-1= -1
输出int i = 0xFFFFFFFF 为 -1 符合
(4)十进制的补码也符合 符号位+序号位的原则
就拿-8来做例子:
-8的补码:1111 1111 1111 1111 1111 1111 1111 1000 可以看出最高位为1 序号位为第2^(31)-8位,(111 1111 1111 1111 1111 1111 1111 1000 = 2^(31)-8 )
则该补码表示的值为2^31- 2^(31)-8 = -8 符合
花费了2~3个小时去查阅相关内容,发现,目前较少相关信息,总结了一下发在这,是对自己学习成果的尊重,同时也希望对大家有点用。
觉得写得不错的点个赞,留个言。欢迎指正
------------------------------------------------------------------------
相关知识点补充:
十六进制用最高位作为符号位,1位负数,0为正数。
负数的位右移运算:
原则:若右移的数字为负值,则向右移动N位同时N个1补充在左边
若为正值,则以N个0补充在左边
相关文章推荐
- 关于0x80000000为什么等于-2147483648和负数在内存上储存的问题
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 关于jvm内存分配的问题heap size [268435456] not equal to maximum heap size [2147483648],需要修改的jvm配置
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767
- 关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 关于用函数指针参数申请动态内存的问题
- 关于Python multiprocessing.Array创建的共享内存无法删除的问题
- 关于DSP内存空间不足的问题
- 关于WIN7 内存占用很大的 问题svchost.exe
- 关于IE中出现的内存不能为written问题的解决方法
- 计算机为什么要用补码存储整型,关于-32768的问题
- c语言初学-关于内存空间的问题
- 关于C语言中内存的3个问题
- 关于栈内存溢出的一个问题
- 关于JAVA(TM) Platfrom SE binary内存过高的问题
- 关于为什么要重载>>和<<问题
- 关于JAVA内存泄漏问题注意事项
- 很有意思的问题,1111.11*100 为什么不等于 111111
- 关于内存slab问题的排查方案
- 关于ViewPager加载多个导致OOM内存溢出的问题。