我遇到了如下代码:
#define SOME_VALUE 0xFEDCBA9876543210ULL
稍后会将SOME_VALUE
分配给某些unsigned long long
。
问题:
ULL
这样的后缀?答案 0 :(得分:7)
在C中,十六进制文字获得int
,unsigned int
,long
,unsigned long
,long long
或unsigned long long
的第一种类型如果没有后缀,则可以表示其值。如果C ++有相同的规则,我不会感到惊讶。
如果你想给一个文字大于默认值的文字,或者如果你想强制它的签名,你需要一个后缀,例如考虑
1 << 43;
没有后缀,即(几乎可以肯定)未定义的行为,但1LL << 43;
例如可以。
答案 1 :(得分:3)
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.2
是double
,而1.2f
是浮动。
答案 4 :(得分:0)
如果您的唯一目的是获得该号码的正确值,则不需要后缀; C会自动选择值适合的类型。
如果要强制表达式的类型,则后缀很重要,例如为了它在表达式中的交互方式。当您要执行会溢出较小类型的算术运算(例如,1ULL<<n
或x*10LL
)并使其无符号时,可能需要长或长。当你希望表达式作为一个整体具有无符号语义时(例如,c-'0'<10U
或n%2U
)。