![](/img/trans.png)
[英]Why do we need to specify the data type again when we define a static variable outside of the class
[英]When do we need to mention/specify the type of integer for number literals?
我遇到了如下代碼:
#define SOME_VALUE 0xFEDCBA9876543210ULL
此SOME_VALUE
將分配給某個unsigned long long
。
問題 :
ULL
這樣的后綴? 在C中,十六進制文字獲取第一種類型的int
, unsigned int
, long
, unsigned long
, long long
或unsigned long long
,如果沒有后綴,則可以表示其值。 如果C ++有相同的規則,我不會感到驚訝。
如果你想給一個文字比默認情況下更大的類型或者如果你想強制它的簽名,你需要一個后綴,例如考慮
1 << 43;
沒有后綴,那是(幾乎可以肯定)未定義的行為,但是1LL << 43;
比如說沒問題。
printf("%ld", SOME_VALUE);
如果未指定SOME_VALUE
的整數類型,則可能最終輸出錯誤。 在C ++中使用指定后綴的一個很好的例子是重載函數。 以下面的例子為例:
#include <iostream>
void consumeInt(unsigned int x)
{
std::cout << "UINT" << std::endl;
}
void consumeInt(int x)
{
std::cout << "INT" << std::endl;
}
void consumeInt(unsigned long long x)
{
std::cout << "ULL" << std::endl;
}
int main(int argc, const char * argv[])
{
consumeInt(5);
consumeInt(5U);
consumeInt(5ULL);
return 0;
}
結果是:
INT
UINT
ULL
如果沒有提到任何后綴,那么編譯器會將積分文字的類型推斷為int
。 因為如果其類型被推斷為int
,則某些整數文字可能會溢出,因此您添加后綴以告訴編譯器將類型推斷為除int
其他類型。 這就是你寫0xFEDCBA9876543210ULL
時所做的。
編寫浮點指針編號時也可以使用后綴。 1.2
是double
,而1.2f
是浮點數。
如果您的唯一目的是獲得正確的數字值 ,則不需要后綴; C自動選擇值適合的類型。
如果要強制表達式的類型 ,后綴很重要,例如,為了在表達式中如何交互。 當你要執行一個會溢出較小類型的算術運算(例如, 1ULL<<n
或x*10LL
)時,可能需要長或長,當你想要它時,使它無符號是有用的表達式作為一個整體具有無符號語義(例如, c-'0'<10U
,或n%2U
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.