unsigned 和 signed 的理解

2021-07-15 12:28:52 字數 1231 閱讀 5376

#include int main(int argc, char *argv)

//結果:65535 -1

這是兩段很簡單的**,我就以第二段**為例。

c語言中常量整數 -1的補碼表示為0xffffffff。擷取後面16位ffff賦值給 變數a(unsigned short)。此時 a = 0xffff(a沒有符號位,0xffff轉換為十進位制為65535)。

a又將0xffff,直接賦值給short b。 此時 b = 0xffff(但是要注意,b是有符號的,0xffff轉換為十進位制為-1)。

執行printf("%d %d",a,b);的時候,要將 a和b的值先轉換為int型:

a沒有符號所以轉為int型為0x0000ffff,

b有符號轉換為int型為0xffffffff。

#include int main(int argc, char *argv)

//結果 -1 -1

a在記憶體中值為0xffffffff,b的值為0xffffffff,都已經32位,

a轉換為int型的時候就是0xffffffff,所以輸出-1.

其實,記住兩點就行了

1.unsigned 型別轉換為 signed型別的時候是直接複製到低位,高位為0.如果signed型別位數不夠,只直接裝載unsigned低位。

2.signed型別轉換為unsigned型別的時候,也是將補碼直接複製到低位,高位為符號位。如果unsigned位數不夠,只直接裝載signed低位。

所有的整型型別都有兩種變體:signed 和 unsigned。 有時候,要求整型變數能夠儲存負數,有時候則不要求。

沒有使用關鍵字unsigned生命的整型變數都被視為無符號的,這種變數可以為正,也可以為負;而unsigned整型變數只能為正

signed 和 unsigned 整型變數占用的記憶體空間大小相同,而signed整型變數的部分儲存空間被用於儲存指出該變數是為正還是為負的資訊,

因此unsigned整型變數能儲存的最大值為signed整型變數能夠儲存的最大正數的兩倍

例如,如果short變數占用2位元組,則unsigned short變數的取值範圍是0 - 65535,而signed short變數的取值範圍內一般為正數,即最大正數為32767,然後,signed short變數也能儲存負數,因此其取值範圍為-32768 - 32767

signed和unsigned的比較

昨天,zrf師兄丟給我這樣乙個題,據說是微軟面試題 unsigned int i 3 cout 問結果是多少。第一反應 3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是 4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fff...

signed和unsigned的比較

unsigned int i 3 cout 問結果是多少。第一反應 3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是 4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fffffffd時,我想我已經離答案很近了.這個涉及到了混...

signed和unsigned取值範圍的問題

就以char為例,char可以是unsigned和singed型別。如果是unsigned型別,取值範圍是 00000000 11111111 即 0 255,一共256個數,這個很好理解。如果是singed型別,第一位是符號位,0表示正數,1表示負數,那麼正數範圍是 00000000 011111...