1. 程式人生 > >0x80000000儲存和表示問題 十六進位制負數表示

0x80000000儲存和表示問題 十六進位制負數表示

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

1
(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