c - 使用带有 uint64_t 类型的内置溢出函数

标签 c gcc built-in integer-overflow

我目前正在编写一个程序,该程序大量使用uint64_t类型,以增强跨平台的兼容性。 碰巧,我的程序有很多溢出的可能性,所以我想使用built in overflow functions from gcc .

不幸的是,它们仅在 intlong intlong long int 等上定义。 uintX_t 类型保证大小始终为 X 位,但这些类型的情况并非如此,例如long int 不保证是 64 位。这让我觉得内置的溢出函数不能在这里使用。

现在如何解决这个问题?

我有两种方法:

  1. 使用 stdint.h 中的 UINT64_MAX 常量并自行进行溢出预测。不过,我并不是“重新发明轮子”的 friend 。

  2. 使用例如__builtin_add_overflow_p 函数仅检查溢出。但是,我不能 100% 确定它们是否可以应用于 uint64_t

最好的方法是什么?我是否在监督一些显而易见的事情?

最佳答案

Using builtin overflow functions with uint64_t
... to use the 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 - 使用带有 uint64_t 类型的内置溢出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59373630/

相关文章:

c - 使用 C 在文本数组中插入和删除空格

c - macOS 上的 "Return type of main is not int"警告

python - 如何使用 Sikuli 中的 “type” 函数检查变量类型

c - 如何使用函数更改变量的地址?

c - 用于在引导加载程序应用程序中计算 crc 的软件逻辑

gcc - 有没有更有效的方法将4个连续的double广播到4个YMM寄存器中?

c - 使用 GCC 和 Make 时如何禁用警告失败?

c - Makefile 给出重复错误 C

将 Int 转换为指示 C 中位位置的 Int 数组

php - 所有 PHP 内置对象的引用?