gpt4 book ai didi

c - 在 C 中实现/强制执行环绕算术

转载 作者:行者123 更新时间:2023-11-30 20:48:25 25 4
gpt4 key购买 nike

C 标准规定算术溢出是未定义的。

我想知道如何以性能友好的方式实现环绕算法。这意味着像here这样的溢出检查解决方案不是一个选项(因为它们会使操作速度减慢大约一个数量级)。

我认为解决方案将涉及编写一个汇编例程来执行此操作。是否有可用的库可以执行此操作(最好是针对多种架构,尽管 x86 是必须的)?

或者,是否有一个编译器标志(用于 gcc 和 clang)使编译器强制执行整数算术的环绕语义?

最佳答案

有符号溢出未定义。无符号溢出换行。实现有符号环绕算术主要是在无符号数学中完成所有操作。不过,有一些事情需要注意:

  1. unsigned Shortunsigned char 算术的工作原理是先将操作数转换为 intunsigned int。通常是 int,除非您的设置很奇怪,其中 int 没有足够的范围来存储所有 unsigned Short 值。这意味着将 shortchar 转换为 unsigned Shortunsigned char 进行算术仍然会产生有符号整数溢出,并且UB。您需要使用 unsigned int 或更大的值进行数学计算,以避免这种情况。
  2. 当原始值超出结果类型的范围时,无符号->有符号转换在技术上是实现定义的。对于大多数编译器和架构来说,这不应该是问题。

或者,如果您想走编译器标志路线,-fwrapv 可以在 GCC 和 Clang 上对加法、减法和乘法进行有符号溢出包装。不过,它对 INT_MIN/-1 没有任何作用。

关于c - 在 C 中实现/强制执行环绕算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40731543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com