簡體   English   中英

我們什么時候需要提及/指定數字文字的整數類型?

[英]When do we need to mention/specify the type of integer for number literals?

我遇到了如下代碼:

#define SOME_VALUE 0xFEDCBA9876543210ULL

SOME_VALUE將分配給某個unsigned long long

問題

  1. 在這種情況下是否需要像ULL這樣的后綴?
  2. 我們需要指定所用整數的類型是什么情況?
  3. 在這種情況下,C和C ++的行為是否有所不同?

在C中,十六進制文字獲取第一種類型的intunsigned intlongunsigned longlong longunsigned long long ,如果沒有后綴,則可以表示其值。 如果C ++有相同的規則,我不會感到驚訝。

如果你想給一個文字比默認情況下更大的類型或者如果你想強制它的簽名,你需要一個后綴,例如考慮

1 << 43;

沒有后綴,那是(幾乎可以肯定)未定義的行為,但是1LL << 43; 比如說沒問題。

  1. 我想不是,但也許那個編譯器需要它。
  2. 例如, 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.2double ,而1.2f是浮點數。

如果您的唯一目的是獲得正確的數字 ,則不需要后綴; C自動選擇值適合的類型。

如果要強制表達式的類型 ,后綴很重要,例如,為了在表達式中如何交互。 當你要執行一個會溢出較小類型的算術運算(例如, 1ULL<<nx*10LL )時,可能需要長或長,當你想要它時,使它無符號是有用的表達式作為一個整體具有無符號語義(例如, c-'0'<10U ,或n%2U )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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