允许 int 宽度选择的 C/C++ 编译器
Posted
技术标签:
【中文标题】允许 int 宽度选择的 C/C++ 编译器【英文标题】:C/C++ Compiler that allows int width selection 【发布时间】:2016-06-01 09:15:40 【问题描述】:有没有人知道现代原生 Windows C 或 C++ 编译器允许您在 16 位和 32 位类型 int 之间进行选择?我在 80 年代遇到了一个具有此功能的交叉编译器,但我需要一个本机编译器。作为教我的学生关于可移植性和标准合规性的一部分,我希望能够自动检查他们的代码是否溢出,如果他们正在乘法,加法等两种类型的 int 数量并且结果将大于 16 位 int 可以代表。谢谢。
【问题讨论】:
现在是 C++ 语言的标准。 C++11 及以后的类型请参见:en.cppreference.com/w/cpp/types/integerint32_t
、int64_t
等。
typedef
并告诉你的学生使用 typedef 的数据类型?
如果您使用typedef
,请注意它与使用原生 16 位 int
并不完全相同。使用类型 int16_t a, b;
、a + b
可能会在 16 位系统上溢出,但由于通常的算术转换而不会在 32 位系统上溢出。
user 694733 有一个好点,但“int16_t
不是真正的int
”问题在更多地方出现。常量32768
不会是int16_t
,表达式1<<15
也不会。
这里有一个元级别的问题:如果你找不到一个重要的编译器,你应该费心教它吗?在您的课程中使用long
可能更容易,因为这在实际编译器上会有所不同(GCC/x64 上为 64,MSVC 上为 32)
【参考方案1】:
查看 C++11 及以后定义的整数类型:http://en.cppreference.com/w/cpp/types/integer:int8_t
、int16_t
、int32_t
、int64_t
几乎所有现代 C++ 编译器都应该支持这些:GCC you can use MinGW on Windows、MSVC、Intel、Clang,甚至是 Borland/Codegear/Embarcardero,因为它们现在是标准的一部分。
固定宽度整数类型自 C99 以来一直是 C 语言的一部分,但最终在 C++11 中添加到 C++ 中,请参阅:N1988
【讨论】:
我之所以选择这个作为最佳答案,只是因为之前的帖子中的一些建议由于算术类型转换而不适用于我的情况。我也无法控制将在这些变量中使用的值。【参考方案2】:C++ 编译器确实支持短裤。如果这是为了教学,你不能告诉你的学生使用短裤而不是整数吗?
如果目的只是告诉他们溢出,为什么不能使用会导致溢出的整数向程序提供输入?像 20 亿 + 20 亿或 20 亿 x 6 这样的输入?
当这是一个问题时,人们还习惯于在那里定义自己的常量,如 INT16 并将它们映射到底层数据类型;就像 INT16 == C++ 的缩写。
最后,如果您对 short 有疑问,C++ 确实提供了 16 位整数类型作为自 C++11 以来的标准数据类型。
如果您确实需要将 int 设为 16 位,您可能会在 Digital Mars 等编译器中找到它,这些编译器允许您以 Win 16 API 或旧版本的 Visual Studio 为目标。
【讨论】:
如果这是用于嵌入式编程,了解所用整数类型的确切宽度通常非常有用,更重要的是,您希望它可以跨编译器和平台移植。__int16
是该语言的特定于供应商的扩展,而不是该语言的原生部分。
当然。这就是为什么我看到的大多数可移植程序都使用诸如 INT16 形式的#defines 之类的东西,并且在移植期间习惯于将 #defines 更改为底层系统上的任何等效项。
那么改变答案的一部分是否没有意义:“最后,如果您对 short 有问题,C++ 确实提供 __int16”,因为 C++ 实际上不提供 __int16
(尽管它提供提供int16_t
) 但编译器可能会提供它。
有道理。改变你的问题也是有意义的,你说你的动机是教学生溢出,你有点暗示整数在教授溢出方面存在一些固有的问题。
嗨阿米特,我不是问这个问题的人。但我是提出答案的人。 :)以上是关于允许 int 宽度选择的 C/C++ 编译器的主要内容,如果未能解决你的问题,请参考以下文章
C/C++编程笔记:那些不会在C ++中编译的C程序,挺特殊奥~