我猜您正在写作(uint64_t)-1
,而不是-1ULL
因为您不想对unsigned long long
?的大小做出假设 如果是这样,那很好。但是,还有一个尚未提及的替代方案(实际上并没有回答您的问题),但可以通过回避问题来省去很多担忧:
替代
一个好习惯是始终使用UINT64_C(x)
而不是(uint64_t)x
. 这是一个定义的宏,<stdint.h>
它会根据需要自动附加U
、UL
或ULL
。因此,根据您的目标,UINT64_C(-1)
解析为-1U
、-1UL
或。-1ULL
这保证始终正常工作。
类型转换的危险
请注意,(uint64_t)x
实际上通常甚至无法正常工作。例如,
(uint64_t)2147483648 // RISKY
由于值 2147483648 (2^31) 太大而无法放入 32 位整数,因此会在某些编译器上生成警告,并且以下内容甚至无法远程工作:
(uint64_t)1000000000000000000 // RISKY
但是,如果您UINT64_C()
改为使用,那么一切都是金色的:
UINT64_C(2147483648) // GOOD
UINT64_C(1000000000000000000) // GOOD
UINT64_C(-1) // GOOD
笔记:
_C
后缀代表“常数”。</li
>- 对于
<stdint.h>
有符号和无符号值,还有 8 位、16 位和 32 位版本。
- 对于 –1 的特殊情况,您也可以只写
UINT64_MAX
.