微機中驗證負數以補碼存儲程序

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章