版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wojiuguowei/article/details/84135876
1.负数在内存中的存储形式
- (1)十进制负数以补码存储于内存上
-8的在内存上存储形式: 1...1000
- (2)十六进制负数以原码存储在内存上
int i = 0x80000001
// i=-1在内存上表示为 10...01
- (3)0x80000000的表示值
0x80000000的值为 -2^31
1后面的31位表示序号位,0...0【类似于数组中的0号位】,表示负数中的最小的一位。由于int的最小值为-2^31,排在负数从小到大的第0位,所以int i = 0x80000000 为 -(2^31)+ 0 = -2^31 - (4)十进制的补码也符合符号位+序号位的原则
以-1为例,其补码为 1..1
11...1序号位为第2^31 -1位
所以其值为 -2^31 + 2^31 -1 = -1 符合预期
gdb调试查看变量2进制、十进制和十六进制表示
//
测试代码
int a = -8;//二进制是补码存储
int b = 0x80000000; //十六进制是以原码存储
int c = 0x80000000;
0x80000000 最高位表示负数,后面的位表示序号,000 0000表示从小到大的第0位及最小值(由于int的最小值为-2^31),所以
int i = 0x80000000为-(2^31)+0
0x800000001 :000 0001表示从小到大的第1位
int i = 0x800000001为-(2^31)+1
扫描二维码关注公众号,回复:
4104548 查看本文章
//
(gdb) x /a
Argument required (starting display address).
(gdb) p /a a
$1 = 0xfffffffffffffff8
(gdb) p /t a
$2 = 11111111111111111111111111111000
(gdb) n
34 int A[8] = {6,-3,-2,7,-15,1,2,2};
(gdb) p /t b
$3 = 10000000000000000000000000000001
(gdb) p /d b
$4 = -2147483647
(gdb) p /d c
$5 = -2147483648
(gdb)
参考: