我们什么时候需要提及/指定数字文字的整数类型?

时间:2012-04-20 15:27:55

标签: c++ c types integer

我遇到了如下代码:

#define SOME_VALUE 0xFEDCBA9876543210ULL

稍后会将SOME_VALUE分配给某些unsigned long long

问题

  1. 在这种情况下是否需要像ULL这样的后缀?
  2. 我们需要指定所用整数的类型是什么情况?
  3. 在这种情况下,C和C ++的行为有何不同?

5 个答案:

答案 0 :(得分:7)

在C中,十六进制文字获得intunsigned intlongunsigned longlong longunsigned long long的第一种类型如果没有后缀,则可以表示其值。如果C ++有相同的规则,我不会感到惊讶。

如果你想给一个文字大于默认值的文字,或者如果你想强制它的签名,你需要一个后缀,例如考虑

1 << 43;

没有后缀,即(几乎可以肯定)未定义的行为,但1LL << 43;例如可以。

答案 1 :(得分:3)

  1. 我想不是,但也许那个编译器需要。
  2. 例如,printf("%ld", SOME_VALUE);如果未指定SOME_VALUE的整数类型,则可能最终输出错误。

答案 2 :(得分:2)

在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

答案 3 :(得分:0)

如果未提及任何后缀,则编译器会将积分文字的类型推导为int。由于某些整数文字的类型推断为int,因此可能会溢出,因此您添加后缀以告诉编译器将类型推导为int以外的类型。这就是你写0xFEDCBA9876543210ULL时的所作所为。

编写浮点指针编号时也可以使用后缀。 1.2double,而1.2f是浮动。

答案 4 :(得分:0)

如果您的唯一目的是获得该号码的正确,则不需要后缀; C会自动选择值适合的类型。

如果要强制表达式的类型,则后缀很重要,例如为了它在表达式中的交互方式。当您要执行会溢出较小类型的算术运算(例如,1ULL<<nx*10LL)并使其无符号时,可能需要长或长。当你希望表达式作为一个整体具有无符号语义时(例如,c-'0'<10Un%2U)。