【发布时间】:2014-05-14 18:51:41
【问题描述】:
请帮我理解这个表达:
(dwStreamSizeMax >> 32i64)
我以前从未见过像 32i64 这样的操作数。谢谢。
【问题讨论】:
-
谷歌也没有。也许是一个简单的
#define? -
预处理器标记不能以数字开头。
标签: c++ visual-c++ 32bit-64bit
请帮我理解这个表达:
(dwStreamSizeMax >> 32i64)
我以前从未见过像 32i64 这样的操作数。谢谢。
【问题讨论】:
#define?
标签: c++ visual-c++ 32bit-64bit
来自 MSDN C++ Integer Constants:
64 位整数后缀:i64 LL ll
也就是说,32i64 将是 64 位大小的整数类型常量,值为32。也就是(__int64) 32,或者(int64_t) 32。
dwStreamSizeMax >> 32i64
请注意,在引用的表达式中,即使对于 64 位 dwStreamSizeMax,有意义的最大移位位数也是 63,它适合 8 位值 (BYTE),因此 64 位大小说明符是多余的。
【讨论】:
((uint64_t)dwStreamSizeMax) >> 32。
dwStreamSizeMax 上的 dw 前缀正确表明它是 DWORD,则将其右移 32 是未定义的行为,因为 DWORD 是 32 位的Windows 上的类型(甚至是 Win64)。
dwStreamSizeMax 提升为 64 位 int 类型,那么表达式也可以替换为 0。
dwStreamSizeMax 是 SIZE_T(因此在 Win64 系统上它将是 64 位类型)并且表达式试图获取高 32 位。这适用于 64 位系统,但在 32 位系统上仍然是未定义的行为。在第 5 版中,大小信息作为两个单独的高/低 DWORD 传递。
它是 64 位整数文字的后缀,与 L 的 long 或 ULL 的 unsigned long long 不同。但是,我相信这是微软主义,而不是可移植的 C++。
C++11 只为long 和long long 类型(以及它们的unsigned 对应物)提供后缀,后者保证为64 位或更多。
【讨论】: