[英]Turbo C++ Constant Limit
在Turbo C ++(對於C語言)中,常量值的限制為-32768至32767。
但是,如果我初始化的值大於32767或小於-32768,則顯示結果。
因此,編譯器如何給出大於32767且小於-32768的值的評估結果。
這些如何計算? 擴展值變為什么?
Turbo C ++是16位編譯器,因此默認情況下常量為16位整數(范圍-32768 .. + 32767)。
您可以添加L
后綴來聲明32位常量,並將其存儲為long型,如下所示:
const long LARGE_CONSTANT = 100000L;
32位長整數的范圍是-2147483648 .. + 2147483647。
如果省略L
后綴或將大常量存儲為int
而不是long
,則它將被截斷為16位。 那是,
const int LARGE_CONSTANT = 100000;
則將暗示LARGE_CONSTANT = -31072
因為-31072
是(唯一)整數x ,因此x mod 2 16 = 100000 mod 2 16 。
假設您編寫類似int i = 40000;
在16位編譯器上。 編譯器足夠聰明,可以意識到字面量40000
實際上太大而不能作為整數,因此40000
字面量的類型很long
。
當您嘗試在C中將long顯示為int時,long會根據以下規則隱式轉換:
C11 6.3.1.3
1將整數類型的值轉換為_Bool以外的其他整數類型時,如果該值可以用新類型表示,則該值不變。
2否則,如果新類型是無符號的,則通過重復添加或減去比新類型可表示的最大值多一個值來轉換值,直到該值在新類型的范圍內為止。
3否則,將對新類型進行簽名,並且無法在其中表示值; 結果是實現定義的,還是引發實現定義的信號。
3)是適用於int
,因為int
是帶符號的。 實現定義的意思是不同的編譯器可以不同的方式實現它。 您的編譯器必須記錄如何完成。
但是實際上,您的編譯器和CPU使用二進制補碼。 因此,將發生的事情是,數字40000
(在二進制級別上等於0x9C40
被簡單地視為帶符號的16位int。 根據二進制補碼, 0x9C40
符號的16的-25536
給出-25536
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.