gpt4 book ai didi

c - 带减法的无符号字符溢出

转载 作者:太空狗 更新时间:2023-10-29 15:32:13 26 4
gpt4 key购买 nike

我正在尝试找出无符号溢出如何与减法一起工作,因此我编写了以下测试来进行尝试:

#include<stdio.h>
#include<stdlib.h>

unsigned char minWrap(unsigned char a, unsigned char b) {
return a > b ? a - b : a + (0xff - b) + 1;
}

int main(int argc, char *argv[]) {
unsigned char a = 0x01, b = 0xff;
unsigned char c = a - b;

printf("0x%02x 0x%02x 0x%02x\n", a-b, c, minWrap(a,b));

return EXIT_SUCCESS;
}

输出为:

0xffffff02 0x02 0x02

我本以为三次输出都是一样的。我的问题是:添加/减去无符号字符并期望它们在 0xff 处环绕总是安全的吗?

或者更一般地说,使用 uintN_t 进行计算并期望结果为模 2^N 是否安全?

最佳答案

is it always safe to add/subtract unsigned chars and expect them to wrap around at 0xff?

没有。在 C 语言中,char 类型的对象会经历通常的整数提升。因此,如果 char 的范围适合 int(通常),则将其转换为 int,否则为 unsigned

a - b --> 0x01 - 0xFF --> 1 - 255 --> -254 >.

以下是未定义的行为,因为 %x 不匹配 int 并且 -254 的值不在 unsigned 范围内(参见 @EOF 评论)。一个典型的行为是转换为 unsigned

printf("0x%02x\n", a-b);
// 0xffffff02

it safe to compute with uintN_t and expect the result to be modulo 2^N?

是的。但一定要生成 uintN_t 类型的结果,并避免意外的普通整数提升

#include <inttypes.h>

uint8_t a = 0x01, b = 0xff;
uint8_t diff = a - b;

printf("0x%02x\n", (unsigned) diff);
printf("0x%02" PRTx8 "\n", diff);

关于c - 带减法的无符号字符溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32613418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com