昨天,zrf師兄丟給我這樣乙個題,據說是微軟面試題:
unsigned int i=3;
cout《問結果是多少。
第一反應:-3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是:
4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fffffffd時,我想我已經離答案很近了...
這個涉及到了混合著不同資料型別的表示式中的資料型別的轉換問題。在總結轉換問題之前,先說明一下各種資料型別(只說明numeric型別的),下表來自msdn:
type namebytesother namesrange of values
int*
signed,
signed int
system dependent
unsigned int
*unsigned
system dependent
__int8
1char,
signed char
–128 to 127
__int16
2short,
short int,
signed short int
–32,768 to 32,767
__int32
4signed,
signed int
–2,147,483,648 to 2,147,483,647
__int64
8none
–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
char
1signed char
–128 to 127
unsigned char
1none
0 to 255
short
2short int,
signed short int
–32,768 to 32,767
unsigned short
2unsigned short int
0 to 65,535
long
4long int,
signed long int
–2,147,483,648 to 2,147,483,647
unsigned long
4unsigned long int
0 to 4,294,967,295
enum
*none
same as int
float
4none
3.4e +/- 38 (7 digits)
double
8none
1.7e +/- 308 (15 digits)
long double
10none
1.2e +/- 4932 (19 digits)
對上表補充說明一下:
1)在32位機上,int型和unsigned int型都是32位的(4個位元組)。
2)enum會跟據最大值來決定型別,一般來說為int型,如果超出int型所能表示的範圍,則用比int型大的最小型別來表示(unsigned int, long 或者unsigned long)
3)關於型別的大小。一般用所能表示的資料範圍來比較型別的大小,如char型
下面結合自己查的資料,加上自己不斷地舉各種情況程式設計,總結一下關於型別轉換(僅限於算術表示式中關於整數型別的轉換)的一些問題(如有缺漏,歡迎補充,感激不盡)
1、所有比int型小的資料型別(包括char,signed char,unsigned char,short,signed short,unsigned short)轉換為int型。如果轉換後的資料會超出int型所能表示的範圍的話,則轉換為unsigned int型;
2、bool型轉化為int型時,false轉化為0,true轉換為1;反過來所有的整數型別轉化為bool時,0轉化為false,其它非零值都轉為true;
3、如果表示式中混有unsigned short和int型時,如果int型資料可以表示所有的unsigned short型的話,則將unsigned short型別的資料轉換為int型,否則,unsigned short型別及int型都轉換為unsigned int型別。舉個例子,在32位機上,int是32位,範圍–2,147,483,648 to 2,147,483,647,unsigned short是16位,範圍0 to 65,535,這樣int型的足夠表示unsigned short型別的資料,因此在混有這兩者的運算中,unsigned short型別資料被轉換為int型;
4、unsigned int 與long型別的轉換規律同3,在32位機上,unsigned int是32位,範圍0 to 4,294,967,295,long是32位,範圍–2,147,483,648 to 2,147,483,647,可見long型別不夠表示所有的unsigned int型,因此在混有unsigned int及long的表示式中,兩者都被轉換為unsigned long;
5、如果表示式中既有int 又有unsigned int,則所有的int資料都被轉化為unsigned int型別。
經過這番總結,前面提出的問題的答案應該就很明顯了吧。在表示式i*-1中,i是unsigned int型,-1是int型(常量整數的型別同enum),按第5條可以知道-1必須轉換為unsigned int型,即0xffffffff,十進位制的
4294967295,然後再與i相乘,即4294967295*3,如果不考慮溢位的話,結果是12884901885,十六進製制0x2fffffffd,由於unsigned int只能表示32位,因此結果是0xfffffffd,即4294967293。
嗯,大約就是這樣了。你感興趣的話,可以換各種形式去寫寫程式,看看結果,很有意思的哦。
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...
signed和unsigned取值範圍的問題
就以char為例,char可以是unsigned和singed型別。如果是unsigned型別,取值範圍是 00000000 11111111 即 0 255,一共256個數,這個很好理解。如果是singed型別,第一位是符號位,0表示正數,1表示負數,那麼正數範圍是 00000000 011111...