3

我遇到了如下代码:

#define SOME_VALUE 0xFEDCBA9876543210ULL

这是稍后 SOME_VALUE分配给一些人的。unsigned long long

问题

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

5 回答 5

7

在 C 中,十六进制文字获取第一种类型int, unsigned int, long, unsigned long,long long或者unsigned long long如果它没有后缀则可以表示其值。如果 C++ 有相同的规则,我不会感到惊讶。

如果您想为文字提供比默认情况下更大的类型,或者如果您想强制其签名,则需要一个后缀,例如考虑

1 << 43;

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

于 2012-04-20T15:33:49.093 回答
3
  1. 我认为不是,但也许那是那个编译器所必需的。
  2. 例如,printf("%ld", SOME_VALUE);如果SOME_VALUE未指定 的整数类型,则可能会导致错误的输出。
于 2012-04-20T15:34:28.360 回答
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

于 2012-04-20T15:39:22.597 回答
0

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

写浮点数时也可以使用后缀。1.2是一个double1.2f而是一个浮点数。

于 2012-04-20T15:40:29.597 回答
0

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

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

于 2012-04-20T15:42:10.557 回答