【发布时间】:2019-12-17 11:48:20
【问题描述】:
我目前正在编写一个大量使用uint64_t 类型的程序,以增强跨平台的兼容性。
碰巧,我的程序有很多溢出的可能性,所以我想使用built in overflow functions from gcc。
不幸的是,它们仅在ints、long ints、long long ints 等上定义。 uintX_t 类型保证始终大小为 X 位,但对于这些类型而言并非如此,例如long int 不保证为 64 位。这让我觉得,这里不能使用内置的溢出函数。
现在如何解决这个问题?
我有两种方法:
使用来自
stdint.h的UINT64_MAX常量并自己进行溢出预测。但是,我不是“重新发明轮子”的朋友。使用例如
__builtin_add_overflow_p函数仅检查溢出。但是,我不能 100% 确定它们是否可以应用于uint64_t。
最好的方法是什么?我在监督一些明显的事情吗?
【问题讨论】:
-
可能有一个函数为“这个溢出”返回 bool 可能很有用。当然,使用一些 GCC 特定的东西对于兼容性并不是很好。就
x86而言,如果我记得出于 unsigned 的目的,可以使用“进位标志”,但我不确定 GCC 是否会公开这一点。 -
我会尝试
__builtin_add_overflow并让编译器整理出类型。uint64_t存在但与unsigned long或unsigned long long不匹配的可能性极小。除非您想移植到曾经制造的每个系统,否则我认为它与现代实现已经足够接近了。如果您需要额外检查,只需添加静态断言。
标签: c gcc built-in integer-overflow