Ale*_*op. 3 c 64-bit bit-manipulation bitmask implicit-conversion
假设以下代码:
uint64_t g_global_var;
....
....
void foo(void)
{
uint64_t local_32bit_low = g_global_var & 0xFFFFFFFF;
....
}
Run Code Online (Sandbox Code Playgroud)
使用当前的工具链,此代码可以按预期工作,local_32bit_low实际上包含的低32位g_global_var。
我想知道标准C是否保证该代码将始终按预期工作?我担心的是,编译器可能会将0xFFFFFFFF视为-1的整数,并且提升为uint64_t0xFFFFFFFFFFFFFFFF时。
聚苯乙烯
我知道,为了安全起见,在这种情况下最好使用0xFFFFFFFFULL。关键是我在旧版代码中看到了它,我想知道是否值得修复。
没有问题。整数常量0xFFFFFFFF具有能够按原样存储值的类型。
根据C标准(6.4.4.1整数常量)
5整数常量的类型是对应列表的第一个,可以在其中表示其值
因此,此值存储为正值。
如果类型unsigned int是32位整数类型,则常量将具有type unsigned int。
否则,它将具有可以存储值的一种类型。
long int
unsigned long int
long long int
unsigned long long int
Run Code Online (Sandbox Code Playgroud)
由于表达式中通常的算术转换
g_global_var & 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)
像
0x00000000FFFFFFFF
Run Code Online (Sandbox Code Playgroud)
请注意,在C中没有负整数常量。例如类似
-10
Run Code Online (Sandbox Code Playgroud)
由两个子表达式组成:主表达式10和- -19带有与完整表达式一致的一元运算符的子表达式。