我正在GNU的C ++編譯器上嘗試此代碼,但無法理解其行為:#include <stdio.h>;int main(){ int num1 = 1000000000; long num2 = 1000000000; long long num3; //num3 = 100000000000; long long num4 = ~0; printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3)); printf("%d %ld %lld %llu", num1, num2, num3, num4); return 0;}當我取消注釋注釋行時,代碼將無法編譯并給出錯誤:錯誤:整數常量對于長型而言太大但是,如果代碼按原樣編譯并執行,它將產生比10000000000大得多的值。為什么?
3 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
字母100000000000組成一個文字整數常量,但該值對于type而言太大int。您需要使用后綴來更改文字的類型,即
long long num3 = 100000000000LL;
后綴LL使文字變為type long long。C不夠“聰明”,無法從左側的類型得出結論,該類型是文字本身的屬性,而不是使用它的上下文。

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
這取決于您以哪種模式進行編譯。long long不是C ++標準的一部分,而是(通常)僅作為擴展支持。這會影響文字的類型。如果int足夠大以表示數字,則不帶任何后綴的十進制整數常量始終為int類型,否則為long。如果該數字太長了,結果將是實現定義的(可能只是為了向后兼容而被截斷的long int類型的數字)。在這種情況下,您必須顯式使用LL后綴來啟用long long擴展(在大多數編譯器上)。
下一個C ++版本將正式支持long格式,除非您明確希望將文字類型的類型強制設置為long格式,否則您將不需要任何后綴。如果數字不能用長整數表示,則即使沒有LL后綴,編譯器也會自動嘗試使用long long。我相信這也是C99的行為。
- 3 回答
- 0 關注
- 615 瀏覽
添加回答
舉報
0/150
提交
取消