【发布时间】:2015-09-16 15:56:40
【问题描述】:
我试图弄清楚无符号溢出如何与减法一起工作,所以我编写了以下测试来尝试一下:
#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 是否安全?
【问题讨论】:
-
语言律师:无符号类型不会溢出。