转载:https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html

下面的内置函数可以执行简单的算术运算,并检查运算是否溢出。

内置函数:bool __builtin_add_overflow( type1 a, type2 b, type3 * res)
内置函数:bool __builtin_sadd_overflow(int a,int b,int * res)
内置函数:bool __builtin_saddl_overflow(长整数a,长整数b,长整数* res)
内置函数:bool __builtin_saddll_overflow(long long int a,long long int b,long long int * res)
内置函数:bool __builtin_uadd_overflow(无符号整数a,无符号整数b,无符号整数* res)
内置函数:bool __builtin_uaddl_overflow(无符号长整数a,无符号长整数b,无符号长整数* res)
内置函数:bool __builtin_uaddll_overflow(unsigned long long int a,unsigned long long int b,unsigned long long int * res)

这些内置函数将前两个操作数提升为无限精度带符号类型,并对这些提升的操作数执行加法运算。然后将结果强制转换为第三个指针参数指向的类型并存储在那里。如果存储的结果等于无限精度的结果,则内置函数返回 false ,否则返回 true 。由于加法运算以无穷大的符号精度执行,因此这些内置函数对所有参数值具有完全定义的行为。

第一个内置函数允许操作数的任意积分类型,结果类型必须是指向枚举型或布尔型以外的某个积分类型的指针,其余的内置函数都有明确的整数类型。

编译器会尽量使用硬件指令来实现这些内置函数,比如加法后溢出时的条件跳转,携带时的条件跳转等。

内置函数:bool __builtin_sub_overflow( type1 a, type2 b, type3 * res)
内置函数:bool __builtin_ssub_overflow(int a,int b,int * res)
内置函数:bool __builtin_ssubl_overflow(长整数a,长整数b,长整数* res)
内置函数:bool __builtin_ssubll_overflow(long long int a,long long int b,long long int * res)
内置函数:bool __builtin_usub_overflow(无符号整数a,无符号整数b,无符号整数* res)
内置函数:bool __builtin_usubl_overflow(无符号长整数a,无符号长整数b,无符号长整数* res)
内置函数:bool __builtin_usubll_overflow(无符号长整型a,无符号长整型b,无符号长整型* res)

这些内置函数与上面的加法溢出检查内置函数类似,只是它们执行的是减法,从第一个参数中减去第二个参数,而不是加法。

内置函数:bool __builtin_mul_overflow( type1 a, type2 b, type3 * res)
内置函数:bool __builtin_smul_overflow(int a,int b,int * res)
内置函数:bool __builtin_smull_overflow(长整数a,长整数b,长整数* res)
内置函数:bool __builtin_smulll_overflow(long long int a,long long int b,long long int * res)
内置函数:bool __builtin_umul_overflow(无符号整数a,无符号整数b,无符号整数* res)
内置函数:bool __builtin_umull_overflow(无符号长整数a,无符号长整数b,无符号长整数* res)
内置函数:bool __builtin_umulll_overflow(unsigned long long int a,unsigned long long int b,unsigned long long int * res)

这些内置函数与上面的加法溢出检查内置函数类似,只是它们执行的是乘法,而不是加法。

下列内置函数可以检查简单的算术运算是否会溢出。

内置函数:bool __builtin_add_overflow_p( type1 a, type2 b, type3 c)
内置函数:bool __builtin_sub_overflow_p( type1 a, type2 b, type3 c)
内置函数:bool __builtin_mul_overflow_p( type1 a, type2 b, type3 c)

这些内置函数类似于 __builtin_add_overflow , __builtin_sub_overflow 或 __builtin_mul_overflow ,不同之处在于它们不将算术运算的结果存储在任何地方,并且最后一个参数不是指针,而是某些具有枚举或布尔类型以外的整数类型的表达式。

内置函数将前两个操作数提升为无限精度带符号类型,并对这些提升的操作数执行加法运算。然后将结果转换为第三个参数的类型。如果强制转换结果等于无限精度结果,则内置函数返回 false ,否则返回 true 。将忽略第三个参数的值,仅评估第三个参数中的副作用,并且不对最后一个参数执行积分参数提升。如果第三个参数是位字段,则用于结果强制转换的类型具有给定位字段的精度和正负号,而不是基础类型的精度和正负号。

例如,可以使用下面的宏在编译时可移植地检查两个常数整数相加是否会溢出,只有在已知安全的情况下才执行加法,并且不会触发一个-Woverflowwarning.

#define INT_ADD_OVERFLOW_P(a, b) \
   __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)
enum {
    A = INT_MAX, B = 3,
    C = INT_ADD_OVERFLOW_P (A, B) ? 0 : A + B,
    D = __builtin_add_overflow_p (1, SCHAR_MAX, (signed char) 0)

编译器会尽量使用硬件指令来实现这些内置函数,比如加法后溢出时的条件跳转,携带时的条件跳转等。

原文链接:https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。Android 的官方文档对 AAudio 的 API 及设计思想做了良好的介绍,这里来看一下 AAudio 的实现。后面的代码分析基于 android-12.1.0_r27 进行。AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。 ffs(n)返回从右向左数第几位是1。n==0时返回0 constexpr int ffs(int n) noexcept { return __builtin_ffs(n) - 1; static_assert(ffs(0b11) == 0); static_assert(ffs(0b10) == 1); clz(n)返回前导0的个数。n==0时返回未定义 constexpr int clz(unsigned n) noexcept { // clz: counting leading z https://git.dpdk.org/dpdk/commit/?id=3ae4beb079ce242240c34376a066bbccd0c0b23e diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 9c891d4..ff5b131 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c 以前从没有升级过GCC,一直用系统默认的GCC版本,最近在研究好久没有用过的 C, 便有了升级GCC的想发,大致如下。 环境: CentOS-6.5-i386 , gcc-4.4.7 系统必须已经安装有一个编译器,因为 gcc 也是需要编译的 首先 gcc 编译需要三个额外库,下载并按照下面的顺序安装它们,如下: 1. gmp      ftp://ftp.gnu.org/gnu/g 我在C ++编写一个程序来找到 B = C,其中A,B和C一起使用所有的数字0-9只出现一次的所有解决方案。 该程序循环了a和b的值,并且每次在a , b和a b上运行一个数字计数例程,以检查是 31 个答案:答案 0 :(得分:194)我看到你正在使用无符号整数。根据定义,在C(不知道C ++),无符号算术不会溢出...所以,至少对于C来说,你的观点是没有意义的:)使用有符号整数,一旦出现溢出,Undefined Behaviour已经发生,您的程序可以执行任何操作(例如:渲染测试不确定)。#include int a = ;int x = ;a += x; /... 1 基本的内存分配和释放   FFmpeg中内存申请和分配的实现都是对malloc和free的包装,基本都在libavutil/mem.c文件中。 1.1 av_malloc、av_mallocz和av_calloc   av_malloc:申请size大小的内存。   av_mallocz:申请size大小的内存并初始化为0. =====================================================FFmpeg的库函数源代码分析文章列表:【架构图】【通用】【解码】【编码】【其它】【脚本】【H.264】=====================================================本文简单记录一下FFmpeg中内存操作的函数。内存操作的常见函数位于libavuti...