簡體   English   中英

C++ 文字整數類型

[英]C++ literal integer type

文字表達式也有類型嗎?

long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649

是的,文字數字有類型。 無后綴十進制整數文字的類型是intlonglong long中可以表示整數的第一個類型。 二進制、十六進制和八進制文字的類型選擇類似,但列表中也有無符號類型。

您可以通過使用U后綴來強制使用無符號類型。 如果在后綴中使用單個L則該類型至少為long但如果它不能表示為long long則可能是long long long 如果使用LL ,則類型必須為long long (除非實現的擴展類型比long long )。

結果是,如果int是 32 位類型而long是 64 位,那么2147483647類型為int2147483648類型為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

住在coliru上

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.

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