【问题标题】:What does operand like 32i64 mean?像 32i64 这样的操作数是什么意思?
【发布时间】:2014-05-14 18:51:41
【问题描述】:

请帮我理解这个表达:

(dwStreamSizeMax >> 32i64)

我以前从未见过像 32i64 这样的操作数。谢谢。

【问题讨论】:

  • 谷歌也没有。也许是一个简单的#define
  • 预处理器标记不能以数字开头。

标签: c++ visual-c++ 32bit-64bit


【解决方案1】:

来自 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)。
  • 如果 @MattMcNabb 的猜测是正确的,即意图将 dwStreamSizeMax 提升为 64 位 int 类型,那么表达式也可以替换为 0
  • 有人告诉里希特先生他的代码有未定义的行为
  • 看起来这是在第 5 版中修复的旧版本代码。在旧代码中,dwStreamSizeMaxSIZE_T(因此在 Win64 系统上它将是 64 位类型)并且表达式试图获取高 32 位。这适用于 64 位系统,但在 32 位系统上仍然是未定义的行为。在第 5 版中,大小信息作为两个单独的高/低 DWORD 传递。
【解决方案2】:

它是 64 位整数文字的后缀,与 LlongULLunsigned long long 不同。但是,我相信这是微软主义,而不是可移植的 C++。

C++11 只为longlong long 类型(以及它们的unsigned 对应物)提供后缀,后者保证为64 位或更多。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2021-12-30
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多