1. 相關基礎知識
負數的補碼等於它的反碼加1,即在其反碼的最低位加1就爲該數的補碼,且在計算機中負數以補碼形式進行存儲。
已知 1、int型佔4字節(32位二進制)char型佔1字節(8位二進制)
2、字符在內存中以ASCII形式存儲(A的爲65,C爲67)
3、在內存中低地址存低位,高地址存高位
2. 具體內容
先規定一個int型負數int i= - 48829;
原碼爲:1 000 0000 / 0000 0000/1011 1110/1011 1101
反碼爲:1 111 1111/ 1111 1111/0100 0001/0100 0010
補碼爲:1 111 1111/ 1111 1111/0100 0001/0100 0011
即可假設該數在內存中的實際存放爲:
低地址位,地址值爲&i 0100 0011
0100 0001
1111 1111
高地址位,地址值爲&i+3 1111 1111
然後用char型指針p1和p2分別指向地址&i和&i+1,並進行輸出,分別得到p1輸出字母C,p2輸出字母A,即說明了&i地址中的內容爲0100 0011,&i+1中的內容爲0100 0001,即驗證了是以補碼形式存儲,而不是原碼或反碼!
3. 實例測試代碼
#include <stdio.h>
int main(void)
{
int i;
char *p1;
char *p2;
i = -48829; //假設負數存儲形式爲反碼,即爲: 1111 1111/ 1111 1111/0100 0001/0100 0011
p1 = (char *)&i; //假設p1指向 0100 0011 (67)
p2 = p1 + 1;//假設p2指向 0100 0001 (65)
printf("%c\n", *p1); //輸出字符C(67),得證
printf("%c\n", *p2); //輸出字符A(65),得證
getchar();
return 0;
}