我目前正在编写一个程序,该程序大量使用uint64_t类型,以增强跨平台的兼容性。碰巧的是,程序中有很多溢出的可能性,所以我想使用built in overflow functions from gcc。
遗憾的是,它们仅在整数,长整数,长整数等上定义。 uintX_t类型保证始终为X位大小,而对于这些类型则不是这种情况。 long int不能保证为64位。这让我觉得,内置的溢出功能不能在这里使用。
现在如何解决此问题?
我有两种方法:
使用来自stdint.h的UINT64_MAX常量,自己进行溢出预测。但是,我不是“重新发明轮子”的朋友。
使用例如__builtin_add_overflow_p函数仅检查溢出。但是,我不确定100%是否可以将它们应用于uint64_t。
最佳方法是什么?我是否正在监督明显的事情?
与
uint64_t
一起使用内置的溢出功能...以使用built in overflow functions from gcc。
要形成自己的builtin_uadd64_overflow()
,而不用“重新发明轮子”,请使用_Generic
引导功能选择。
#define builtin_uadd64_overflow(a,b,r) _Generic(*(r), \
unsigned: __builtin_uadd_overflow, \
unsigned long: __builtin_uaddl_overflow, \
unsigned long long: __builtin_uaddll_overflow \
)(a,b,r)
根据C标准(§6.2.5/ 9),定义无符号溢出的行为
涉及无符号操作数的计算永远不会溢出,因为无法用所得的无符号整数类型表示的结果的模数要比该所得的类型可以表示的最大值大一模。
所以,如果您有类似的附加内容;
uint64_t a, b, c;
c = a + b;
您可以检查操作是否因测试而溢出
int overflowed = c < a || c < b;
当然,如果需要,您可以将其包装到一个函数中。