2009-08-14 61 views
2

我想了解一下這個:當我嘗試將一個整數值分配給int變量(16位編譯器,2個字節的整數)讓我們說:類型選擇在C字面數值

int a; 

a=40000; 

不能用它將被截斷的類型的範圍表示。但是我所看到的是a中的結果值是-25000(或某個接近數字)的位模式,這意味着編譯器爲十進制選擇的二進制表示形式是無符號整數表示形式。這引發了我的問題:編譯器如何爲此文字表達式選擇類型?

我猜測它使用的類型能夠處理所需的存儲空間較少的值。

+1

一個好的編譯器會發出在這種情況下的警告。 – 0x6adb015 2009-08-14 13:23:19

回答

2

這裏的行爲在C89和C99之間有所不同。

在C89,十進制整數字面取第一這些類型在其中它可被表示的:

int, long, unsigned long 

在C99,十進制整數字面取第一這些類型在其中它可被表示的:

int, long, long long 

爲特定的代碼片斷它沒有什麼區別,因爲40000是保證適合在長,但也有C89和C99文字之間的一些差異顯著。

其中的一些後果描述如下:

http://www.hardtoc.com/archives/119

0

以十六進制表示的40000爲0x9C40。注意這個值的最高有效位是1(0x8000)。假設有two's complement表示形式,這意味着如果您將0x9C40嵌入到有符號表示形式中,那麼通過從其餘符號位中減去該值,您將得到0x1C40 - 0x8000 = -0x63C0 = -25536(基數爲10)。

查看CERT C安全編碼標準維基上的INT00-C. Understand the data model used by your implementation(s)INT02-C. Understand integer conversion rules以獲取更多信息。

+0

真實和相關,但我認爲實際的問題是「編譯器如何選擇文字的類型」,而不是「當我從該類型分配給int時會發生什麼」。 – 2009-08-14 13:41:26

2

Kernighan & Ritchie,附錄A2.5.1(整數常數),對193:

恆定的類型整數 取決於其形態,價值和 後綴...如果它是無後綴和 十進制,它具有這些類型中的第一個 類型,其值可以是 表示:int,long int,unsigned long int。

請注意,此答案僅與C89相關,因爲「C編程語言」的第二版早於C99標準。