0x80000000儲存和表示問題 十六進位制負數表示
阿新 • • 發佈:2018-11-16
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
//
(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 = 1000000000000000000000000000000
(gdb) p /d b
$4 = -2147483647
(gdb) p /d c
$5 = -2147483648
(gdb)
參考:
https://www.jianshu.com/p/5e5bf7e49620
https://blog.csdn.net/yasi_xi/article/details/9263955