整数溢出测试运算符?(+)

use*_*939 3 c integer integer-overflow

这个问题可能只是另一种不正确地解释操作员的情况.但不久之前,我看到有人发推文关于一个运营商的信息,据称可以用来检查C中的整数溢出.即&+(&符号加)运算符,它可以像这样使用:

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint32_t x, y;

    x = 0xFFFFFFFF;
    y = 1;

    if (x &+ y) {
        printf("Integer overflow!\n");
    } else {
        printf("No overflow\n");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它看起来确实像人们期望的那样工作,GCC 6在使用这些参数进行编译时不会给我任何警告或错误: gcc -Wall -Wextra -Werror of.c

但奇怪的是,我还没有找到关于这个运算符的任何文档,我从来没有看到它在任何地方使用过.有人可以解释一下这是如何工作的?

tem*_*def 8

表达方式

x &+ y
Run Code Online (Sandbox Code Playgroud)

被解析为

x & (+y)
Run Code Online (Sandbox Code Playgroud)

使用一元加运算符,它没有效果(在这种情况下),只返回y.这意味着表达式相当于

x & y
Run Code Online (Sandbox Code Playgroud)

这不会测试整数溢出,而是只检查如果X和Y具有任何公共位.尝试将x和y更改为1,看看会发生什么; 它会报告溢出,即使没有发生.

  • @StoryTeller,你读错了.Nsz还说"通常算术转换的一部分".这是C标准中的精确技术术语,C标准精确地规定了它适用的地方.位操作包含在其中. (2认同)