[英]Integer literal is too large to be represented in any integer type — C++
[英]C++ literal integer type
文字表達式也有類型嗎?
long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ;
std::cout << a << ',' << b ; // -2147483648,2147483649
是的,文字數字有類型。 無后綴十進制整數文字的類型是int
、 long
、 long long
中可以表示整數的第一個類型。 二進制、十六進制和八進制文字的類型選擇類似,但列表中也有無符號類型。
您可以通過使用U
后綴來強制使用無符號類型。 如果在后綴中使用單個L
則該類型至少為long
但如果它不能表示為long long
則可能是long long
long
。 如果使用LL
,則類型必須為long long
(除非實現的擴展類型比long long
)。
結果是,如果int
是 32 位類型而long
是 64 位,那么2147483647
類型為int
而2147483648
類型為long
。 這意味着2147483647+1
將溢出(這是未定義的行為),而2147483648+1
只是2147483649L
。
這是由 C++ 標准的 §2.3.12 ( [lex.icon]
) 第 2 段定義的,上面的描述是該部分表 7 的總結。
重要的是要記住,賦值目標的類型不會以任何方式影響賦值右側表達式的值。 如果你想強制一個計算得到long long
結果,你需要強制計算的某些參數為long long
; 僅分配給long long
變量是不夠的:
long long a = 2147483647 + 1LL;
std::cout << a << '\n';
產生
2147483648
int a = INT_MAX ;
long long int b = a + 1 ; // adds 1 to a and convert it then to long long ing
long long int c = a; ++c; // convert a to long long int and increment the result with 1
cout << a << std::endl; // 2147483647
cout << b << std::endl; // -2147483648
cout << c << std::endl; // 2147483648
cout << 2147483647 + 1 << std::endl; // -2147483648 (by default integer literal is assumed to be int)
cout << 2147483647LL + 1 << std::endl; // 2147483648 (force the the integer literal to be interpreted as a long long int)
您可以在此處找到有關整數文字的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.