輸出變量的字節表示形式

深入理解計算機系統P28提到了輸出變量的字節表示形式。
不同的處理器,有兩種排列表示規則,一種是小端法,另一種是大端法。

書中圖2-4提供的程序使用的是unsigned char 類型的指針變量。然後我試着輸出了16(int)的字節表示形式,如下圖:
這裏寫圖片描述

隨後我有一個想法,輸出字節表示形式能否用char類型的指針變量呢?經過實驗發現16(int)的字節表示形式與之前的結果是完全相同的。但-16(int)的字節表示形式的結果與之前有些”不同”了,結果爲:
這裏寫圖片描述

隨後通過網絡查找關於unsigned char 與 char的資料也沒有找到答案。後來查找到了關於輸出佔位符%x的含義:”%x無符號以十六進制表示的整數”。

咦?整數?好像找到了原因。
整數佔4個字節,2個16進制位佔1個字節,機器存儲整數是以補碼的形式。負數的最高位是1,那也就需要輸出8個16進制位了。

關於符號位擴展的相關資料:

一、短數據類型擴展爲長數據類型

1、要擴展的短數據類型爲有符號數的
進行符號擴展,即短數據類型的符號位填充到長數據類型的高字節位(即比短數據類型多出的那一部分),保證擴展後的數值大小不變

[1]:char x=10001001b; short y=x; 則y的值應爲11111111 10001001b;
[2]:char x=00001001b; short y=x; 則y的值應爲00000000 00001001b;

2、要擴展的短數據類型爲無符號數的
進行零擴展,即用零來填充長數據類型的高字節位

[1]:unsigned char x=10001001b; short y=x; 則y的值應爲00000000 10001001b;
[2]:unsigned char x=00001001b; short y=x; 則y的值應爲00000000 00001001b;

二、長數據類型縮減爲短數據類型

如果長數據類型的高字節全爲1或全爲0,則會直接截取低字節賦給短數據類型;如果長數據類型的高字節不全爲1或不全爲0,則轉會就會發生錯誤。

三、同一長度的數據類型中有符號數與無符號數的相互轉化

直接將內存中的數據賦給要轉化的類型,數值大小則會發生變化。另短類型擴展爲長類型時,但短類型與長類型分屬有符號數與無符號數時,則先按規則一進行類型的擴展,再按本規則直接將內存中的數值原封不動的賦給對方。

發佈了130 篇原創文章 · 獲贊 6 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章