簡體   English   中英

Turbo C ++常量限制

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM