整数常量的无符号类型

时间:2019-07-04 08:35:28

标签: c

我对整数常量的类型感到困惑,如here所述:

在第一行上,如果常量以'u'结尾,为什么十进制常量必须为signed类型,而八进制或十六进制常量可以为unsigned类型?

我认为如果signed版本不适合使用常量作为无符号版本会出现问题,例如:

long long l1 = 0xffffffff + 0xffffffff;  // 0xffffffff is unsigned int
long long l2 = 4294967295 + 4294967295;  // 4294967295 is signed long 

l1是fffffffe,而l2是1fffffffe。显然l1是错误的

2 个答案:

答案 0 :(得分:3)

如果我要说的话,我会回答十六进制和八进制数字表示的位模式比十进制数字更紧密,因此C标准委员会决定将十六进制和八进制数表示为即使没有后缀U也没有签名。

考虑有多少人会写这样的代码:

uint32_t b = a & 0xFFFFFFF0;

uint32_t b = a & 4294967280; // or -15?

答案 1 :(得分:0)

与常量不是正确的类型相比,此问题导致的问题更多是因为对操作使用了错误的类型。

// some_wide_type = some_narrow_type + some_narrow_type --> trouble
long long l1 = 0xffffffff + 0xffffffff;
long long l2 = 4294967295 + 4294967295;

代替使用目标类型进行数学运算

long long l1 = 0LL + 0xffffffff + 0xffffffff;
long long l2 = 0LL + 4294967295 + 4294967295;

或使用1种(long long)而不是3种(long long, unsigned long, long

long long l1 = 0xffffffffLL + 0xffffffffLL;
long long l2 = 4294967295LL + 4294967295LL;