【发布时间】:2017-09-10 05:53:54
【问题描述】:
我正在使用 Visual Studio Compiler 在 Windows 上进行 C++ 开发,特别是 Visual Studio 2015 Update 3。
对于一些与 DSP 相关的工作,我使用 unsigned int/unsigned long 数据类型。我想知道这两个内置的 C/C++ 类型有什么区别。
我通过 Google 和 SO 搜索了一下,找到了这些参考资料。
- Types documentation cppreference.com
- Types documentation MSDN for Visual Studio 2015
- Types documentation 用于 GNU C/C++(G++ compiler 表示 C/C++ 使用相同的默认类型实现,我在这里参考 C 文档)
我假设 cppreference 文档是 ISO C++11 标准的总结。因此,从“标准”来看,unsigned 和 unsigned int 是 16/32 位,具体取决于 LP/ILP 32/64 数据模型,而 unsigned long 和unsigned long int 为 32/64 位,具体取决于 LP/ILP 32/64 数据模型。
对于 MSDN 和 GNU 文档,他们都表示 unsigned int/unsigned long 使用 32 位实现,并且可以保存高达 4,294,967,295 的值。然而 GNU 文档还指出,根据您的系统 unsigned long 可能是 64 位,它与 unsigned long long int 相同。
所以我的问题如下:
- 对于无符号长 64 位,超出上限 4,294,967,295 是未定义行为还是正确行为?
- 如果我有一个在 Visual Studio 中编译的在 Windows 系统上运行的应用程序,基本都是 unsigned == unsigned long。对还是错?
- 如果我有一个由 GNU 编译器在 Linux/Windows 上编译的应用程序,我必须确定是 unsigned long == unsigned int 还是 unsigned long == unsigned long long 以避免数据溢出。对或错
- 如果我有一个可能由所有这些 Visual Studio/GNU/Clang/Intel 编译器编译的跨平台应用程序,我必须使用一堆预处理器对环境进行明确分类以避免数据溢出。对或错
提前致谢。
编辑: 感谢@PeterRuderman 指出超出无符号类型的 ceil 值并不是未定义的行为。
那么我的问题1会变成:
- 对于 unsigned long 64 位,超出上限 4,294,967,295 会导致自身回绕吗?
【问题讨论】:
-
请注意,即使
unsigned int和unsigned long恰好具有相同的范围和表示形式,它们仍然是不同的类型。
标签: c++ visual-studio gcc g++