signed和unsigned取值範圍的問題

2021-07-05 03:46:58 字數 679 閱讀 7487

就以char為例,char可以是unsigned和singed型別。

如果是unsigned型別,取值範圍是:00000000 —— 11111111 ,即 0——255,一共256個數,這個很好理解。

如果是singed型別,第一位是符號位,0表示正數,1表示負數,那麼正數範圍是:00000000 ——01111111 ,即0——127,而負數在記憶體中可儲存的範圍是:10000000——11111111,即-128—— -1,因為負數在記憶體中以補碼形式儲存,除去符號位 000 0000——111 1111正好有128個數字,所以負數取值範圍是-1——-128,-1的補碼是1111 1111,-128的補碼是 1000 0000。

如果對乙個變數賦的值超出該型別能容納的取值範圍,編譯器會怎麼處理呢?

以char為例:

unsigned char c = -1;

unsigned char取值範圍是0——255,unsigned char的大小是256,c中實際儲存的值是255,即-1%256。

signed char d = 300;

signed char 取值範圍是 -128 ——127,signed char 的大小是256,d中實際儲存的值是44,即 300%256,許多的編譯器都會這樣處理,像處理unsigned型別一樣,但是我們並不能保證每個編譯器都會這麼做。

signed和unsigned的比較

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

signed和unsigned的比較

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

unsigned 和 signed 的理解

include int main int argc,char argv 結果 65535 1 這是兩段很簡單的 我就以第二段 為例。c語言中常量整數 1的補碼表示為0xffffffff。擷取後面16位ffff賦值給 變數a unsigned short 此時 a 0xffff a沒有符號位,0xff...