为什么 `__builtin_{{s,u}{add,sub,mul}ll_overflow` 给出了 `long int` 结果而不是 `long long int` 结果?
Why do `__builtin_{{s,u}{add,sub,mul}ll_overflow` give a `long int` result instead of a `long long int` result?
int
版本的溢出检查 add/subtract/multiply GCC 中的内置函数 return int
结果(良好),以及 long int
版本 return 一个 long int
结果(也不错),但是 long long int
版本 return 一个 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
版本完全无用.
这是 GCC 中的一个错误,尚未修复。
int
版本的溢出检查 add/subtract/multiply GCC 中的内置函数 return int
结果(良好),以及 long int
版本 return 一个 long int
结果(也不错),但是 long long int
版本 return 一个 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
版本完全无用.
这是 GCC 中的一个错误,尚未修复。