我正在修改LL
对硬编码常量使用“long long”( ) 数据类型定义的遗留代码,如下所示:
0xFFFFFFFFFFFFFFFFLL
我相信LL
附加到常量的保证该常量将被解释为long long
.
但是,我不想long long
在位数方面依赖于任何特定的编译器相关解释。
因此,我希望我的变量声明不LL
使用常量,而是使用:
uint64_t a = static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF);
我想认为0xFFFFFFFFFFFFFFFF
编译器在转换为 之前不会将常量解释为 32 位整数uint64_t
,这将导致a
成为包含 value 的 64 位整数0xFFFFFFFF
,而不是所需的值。
(我目前感兴趣的 64 位编译器是 VS 2010 和 Ubuntu 12.04 LTS GCC。但是,我希望这段代码能够以任何现代编译器所需的方式运行。)
对于大多数或所有现代编译器,上述代码是否会按预期工作,因此a
正确设置的值可以根据需要包括常量中的所有数字,0xFFFFFFFFFFFFFFFF
而不包括LL
常量末尾的 ?
(注意:包含I64
在常量末尾会导致编译器错误。也许有另一个标记需要(或可以)包含在常量末尾以告诉编译器将常量解释为 64 位整数?)
(另外:也许甚至static_cast<uint64_t>
是不必要的,因为变量被明确定义为 uint64_t?)