使无符号整数下流抛出异常
Making unsigned integer underflow throw an exception
我知道在某些应用中,使用无符号整数over/underflow是获得廉价模运算的好方法。
在我的代码中,我只使用uint
作为容器的索引,所以我从不想要这种行为。
-
这是个坏主意吗?我应该在所有地方都使用
int
吗?我确实需要做一些令人讨厌的事情来让for循环计数到0 -
是否有一种不太安全的无符号整数类型的常用实现?抛出异常的东西?
-
编译器(对我来说是gcc, clang)在给定的编译单元中提供了一种减少不安全行为的机制吗?
首先,一个术语上的问题:没有所谓的无符号整数下流,确切地说是,因为包围的方式(使用模运算),这可能就是您所指的短语。
第二,这是一个常见的场景吗?是的,有点。你不是唯一一个用循环做"讨厌的事情"来进行反向计数的人,我敢打赌有很多错误是人们没有做"讨厌的事情"的,结果,他们的代码中隐藏着一个令人讨厌的无限循环。请注意,我不确定我是否会说unsigned是"不安全的";像任何东西一样,它们是无限可能工作的一个子集的正确工具,并且在这个子集中它们是完全安全的。
对于是否应该使用无符号整数作为数组索引存在争议。一些标准委员会成员认为在标准库中使用它们是一个错误;我知道Stack Overflow上的一些c++社区成员也讨厌unsigned
值,希望它们消失。
我个人认为,在默认情况下访问整型的整个范围是绝对重要的(为了一个"-1"哨兵值或其他什么而失去这个是不值得的),所以我认为—虽然您并不是唯一有此要求的人,但这是一个合理的要求—默认情况下使用无符号数组索引是一件好事。(负的数组索引到底是什么?语义,人!)
但这在这种情况下没有帮助。那么,你能做些什么呢?不,没有捕获无符号整数实现(至少,我知道没有,更不用说广泛了),因为这将从字面上违反c++定义的类型规则:它将引入定义良好的下溢/溢出语义,而下溢/溢出甚至不应该发生。
您必须使用有符号整数并检查"逻辑下溢"(即超出您的期望范围,例如-1)。你可以把这个行为包装在一个类中。
我想你可以实际上只是包装一个无符号整数,而你在它,添加一些额外的逻辑到operator--
和operator-=
来检测一个包裹和抛出。
但我想我的观点是,无论你做什么,它都将在你的"代码空间"中,从而受到性能下降的影响。您无法从平台本身看出这种行为。
- 从构造函数抛出异常时如何克服内存泄漏
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 从 std::string 转换为 const 无符号整数
- 抛出字符但捕获整数:如何处理异常的促销和转化
- 为什么尽管变量是无符号整数,但该程序仍以 -25 给出输出
- 即使启用了 Wextra,gcc 也不会给出将无符号整数< 0 进行比较的警告
- c++标准是否允许添加两个整数(基本类型int)来抛出c++异常?
- 我的For循环出了什么问题?我得到警告:有符号和无符号整数表达式之间的比较[-Wsigncompare]
- 无抛出异常保证和堆栈溢出
- 使无符号整数下流抛出异常