【问题标题】:Can I specify whether to cap or overflow integers in C/C++?我可以指定是否在 C/C++ 中限制或溢出整数?
【发布时间】:2013-05-26 09:53:36
【问题描述】:

我可以在 C/C++ 中选择是否限制或溢出整数值?还是那些编译依赖?

【问题讨论】:

标签: c++ c integer overflow


【解决方案1】:

您所说的“封顶”称为“饱和度”。数字信号处理器 (DSP) 支持硬件饱和是很常见的,但大多数微处理器自然会溢出和回绕。支持 DSP 扩展(例如 MMX)的处理器也支持饱和。

语言对饱和度的支持通常由编译器扩展、内在函数和库提供。在 C++ 中也许可以创建一个用于饱和算术类型的模板类。

来自我对this question的回答:

ISO/IEC JTC1 SC22 WG14 N1169 (编程语言 - C - 支持嵌入式处理器的扩展)指定_Sat 类型 饱和数据类型的限定符。我从来没有尝试过使用它 任何编译器,但它包含在GCC 4.x documentation 中。

VC++ 2003 以后支持MMX intrinsics,允许饱和 算术。

请注意,在不支持饱和算术硬件的处理器上,使用它可能会影响性能。

【讨论】:

  • 当合适的大学教授将其作为练习分配给学生时,饱和算术的软件实现也会产生有趣的图表。 blog.regehr.org/archives/392
【解决方案2】:

“溢出”无符号整数类型是由 C 和 C++ 标准规定的明确定义的行为。 (对于吹毛求疵的人:我知道它在技术上没有被定义为溢出,但这不是符合大多数人真正感兴趣的定义。)

溢出的有符号整数类型,另一方面,是undefined behavior。任何事情都有可能发生。

【讨论】:

  • 那么,让我直截了当地说,整数溢出被明确定义为未定义的行为?我明白了,但必须理解逻辑悖论......
  • @user2341104:注意 unsignedsigned 整数类型之间的区别。一个是明确定义的,另一个是未定义的。
  • @user2341104 - 不,它是为无符号定义的,未定义为有符号的。 “nitpicker”位只是指术语 overflow 的不准确和常见误用。如果一个词的误用足够普遍,那么它通常 defacto 就意味着用户想要它的意思。
【解决方案3】:

正如詹姆斯已经说过的,有符号整数溢出是未定义的行为。请参阅此处https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow 了解如何处理它的一些想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2021-12-04
    • 2016-07-01
    • 2015-03-25
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多