【问题标题】:DWORD format specifierDWORD 格式说明符
【发布时间】:2016-02-13 19:06:14
【问题描述】:

这是this 的后续问题。

难道DWORD 在某些平台上与int相同(如何检查?)?如果是这样的话,那么:

  DWORD v1, v2, v3, Build;
  GetVersion(&v1, &v2, &v3, &Build);
  sprintf(VersionStr, "%d.%d.%d.%d", v1, v2, v3, Build);

在那个平台上不是未定义的行为,对吗?

或者上面的代码总是 UB 无处不在?

如何在该平台上检查DWORD是否与int相同?

(因为也许我正在考虑在上面运行此代码的那台计算机上不是未定义的行为)

【问题讨论】:

  • 我在 Windows 7 的 Visual Studio 2013 环境中找到了这段代码:typedef unsigned long DWORD;
  • @JoachimPileborg:所以我的代码总是 UB?
  • 绝不是只是 int。可能是unsigned long,也可能是unsigned int,重要的是它总是 unsigned 并且总是32 位。
  • 是的,使用错误的格式是未定义的行为,即使对于像signedunsigned 这样简单的事情也是如此。参见例如stackoverflow.com/q/5851524/440558

标签: c++


【解决方案1】:

在 32 位编译器上,可用于打印 DWORD 值的格式说明符是 %lu。如果要以十进制格式打印值,也可以使用%ld

您也可以参考一个帖子:Why in C++ do we use DWORD rather than unsigned int?

【讨论】:

  • 取决于编译器和目标平台。使用 GCC 并针对 64 位系统,long 是 64 位,而 DWORD 仍然是 32 位。
  • @JoachimPileborg:- 没错,这取决于编译器。
  • 所以我们可以回击 OP:“不,它不是 ALWAYS UB”。更像是,“这取决于”:)
  • @Jongware:为什么它取决于它是否总是未签名它总是 UB,不是吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多