GCC中溢出检查add / subtract / multiply builtins的int
版本返回int
结果(好),long int
版本返回long int
结果(也很好),但long long int
版本返回long int
结果(不好)。为什么是这样?这对我来说似乎很疯狂。
示例:
bool __builtin_uadd_overflow (unsigned int a, unsigned int b, unsigned int *res)
bool __builtin_uaddl_overflow (unsigned long int a, unsigned long int b, unsigned long int *res)
bool __builtin_uaddll_overflow (unsigned long long int a, unsigned long long int b, unsigned long int *res)
这太破碎了,我甚至不敢相信。这意味着在long
和long long
大小不同的目标(例如,32位ARM iOS目标)上,ll
版本的函数完全没用。