signed unsigned 的數值概念

2021-06-17 16:19:31 字數 1879 閱讀 7407

1. signed 和 unsigned 是兩種型別,對儲存器中的內容作不同的數值上的解釋,可以理解為乙個解碼過程

(signed, unsigned 控制儲存空間中最高位的使用,char, int等控制訪問的位元組數):

如:(signed char)0x81的數學上的值是-127

(或者十六進製制表示為-7f,符號和進製無關,所以儲存的內容到數學上的值,需要乙個理解上的轉化過程)

(用printf("%d", char(0x81)列印)

0x81是有符號數值的補碼表示,轉化到數學上的數值的方法是,符號位為1為負"-",絕對值是剩下的7位的反碼+1;數學上的操作都是以-127來運算的,運算得到的結果又要儲存到儲存空間中,這是乙個編碼的過程,和上面的過程相反。涉及到機器指令的話,數學上的加減操作,一步就位了,涉及到程式語言的話,分抽象化的數**算和對儲存的編譯碼,更容易理解一點。

(unsigned char)0x81數學上的值為+129(或者十六進製制表示為+81):沒有符號位,8位全部表示值。

所以同樣的儲存內容,unsigned 和 signed 對其內容的數值上的理解是不一樣的。

注意:對於同樣的編碼的字串,儲存在儲存器上的內容是一樣的,這裡並不涉及到數值的概念。

2. char 有可能是signed char 也有可能是unsigned char,編譯器可以設定,具體情況待研究?。

3. 位操作

signed char ch = 0x81;

printf("%d", (int)(ch >> 1));

printf("%x", (int)(ch >> 1));

列印結果是-64和ffffffc0,有符號高位需要符號位的擴充套件。(高位指高出char的三個位元組中的bits)

這裡的移位過程是這樣的:

1. 從sign char 到 signed int先符號擴充套件成0xffffff81

2. 0xffffff81向右移動一位0x7fffffc0

3. 左側空出的一位用符號位填充0xffffffc0

步驟2和3可以合成乙個操作。

以上過程可以體現出用補碼表示資料的好處。如果不用補碼回事怎麼樣呢?

4. 上面涉及到型別轉化時的高位擴充套件,這裡可以有很多情況。

a) 位元組少的到位元組多的轉化

signed char --> signed int : 都是補碼表示,符號位擴充套件即可,如0x81-->0xffffff81;

unsigned char --> signed int : 高位用0填充,0x81-->0x00000081;

signed char --> unsigned int : 高位符號擴充套件,如:0x81-->0xffffff81;

unsigned char --> unsigned int : 高位用0填充,0x81-->0x00000081;

所以,符號位的擴充套件與否,取決於被擴充套件的型別。

b) 同樣位元組數型別轉化

unsigned char --> signed char : 位元組拷貝,不做任何其他操作,0x81 --> 0x81;

signed char --> unsigned char : 位元組拷貝,不做任何其他操作,0x81 --> 0x81;

a) 位元組多的到位元組少的轉化:

unsiened int --> signed char : 低位位元組拷貝,不考率符號,0x80000001-->0x01;

signed int --> signed char : 低位位元組拷貝,不考慮符號,0x80000001-->0x01,這已經能保證signed char 能表示的數的正確轉化了;

signed int --> unsigned char : 同上,0x80000001-->0x01

unsigned int --> unsigned char : 同上,ox8000001-->0x01

signed unsigned 引發的血案

bug描述 問題產生於區域網傳輸一幅。服務端負責傳送,是由另乙個同事用c 寫的,我用c 寫接收客戶端。我們約定在傳輸一幅前,先傳固定4個位元組的size資訊,然後傳資料。結果發現有些總是末尾壞掉一截或是乾脆就傳不過來。bug原因 在我接收到size 4 後,我採用了size size 3 256 2...

深入理解signed unsigned 關鍵字

深入理解signed unsigned 關鍵字 答 1.0 和 0 在記憶體裡面分別怎麼儲存 十進位制數 原碼 反碼 補碼 0 00000000 00000000 00000000 0 10000000 11111111 00000000 2.就以類似的例子來描述 unsigned int a 6 ...

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...