我对整数常量的类型感到困惑,如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是错误的
答案 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;