C 中负整数的加法如何工作?

问题描述 投票:0回答:1

给出这个简单的代码片段:

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

int main() {
    int8_t a = -1;
    printf("Dec: %d, Hex: %hhx\n", a, a);
    int8_t b = a + 1;
    printf("Dec: %d, Hex: %hhx\n", b, b);
    return 0;
}

结果是:

Dec: -1, Hex: ff
Dec: 0, Hex: 0

这是有道理的,看起来我的系统正在使用二进制补码来实现负整数。

但现在我的问题是

a
是一个8位有符号整数。当
0xff
加 1 时,应该会导致整数溢出。根据这个问题,有符号整数溢出是不是定义的行为。

因此,我的问题是加法如何适用于 8 位负整数,以避免未定义的行为。

和整数提升有关系吗?如果是这样,请解释它在底层是如何工作的。

谢谢你。

c addition uint8t 8-bit negative-integer
1个回答
0
投票

无符号整数不会溢出,只会环绕。当您分析二进制补码在幕后如何工作时 - 您分析的是无符号整数。

当有符号整数的值大于最大或最小有符号值存储到该整数时,就会发生上溢(或下溢)。

对于

int8_t
,这些值为
-128
127
。所以当你想加或减
1
时,只有
-128 - 1
127 + 1
才会导致溢出。
-1 + 1
没有。

© www.soinside.com 2019 - 2024. All rights reserved.