以下C代码正确显示结果,-1
。
#include <stdio.h>
main()
{
unsigned x = 1;
unsigned y=x-2;
printf("%d", y );
}
- 但总的来说,做减法总是安全的吗? 无符号整数?
我问这个问题的原因是我想做一些调理 如下:
unsigned x = 1; // x was defined by someone else as unsigned, // which I had better not to change. for (int i=-5; i<5; i++){ if (x+i<0) continue f(x+i); // f is a function }
这样做安全吗?
无符号整数和有符号整数有何不同 代表整数?谢谢!
最佳答案
1:
是的,减去无符号整数是安全的。无符号整数的算术定义包括,如果将生成超出范围的值,则应对该类型的最大值加一进行模数调整。 (这个定义相当于截断高位)。
虽然您发布的代码有一个错误:printf("%d", y);
导致未定义的行为,因为 %d
需要一个 int
,但您提供了 unsigned int
。使用 %u
更正此问题。
2:
当您编写 x+i
时,i
被转换为 unsigned
。整个表达式的结果是一个明确定义的 unsigned
值。由于 unsigned
永远不会为负,因此您的测试将始终失败。
您还需要小心使用关系运算符,因为会发生相同的隐式转换。在我为您修复第 2 部分中的代码之前,当 x
为 UINT_MAX
或接近它时,您希望将什么传递给 f
? f
的原型(prototype)是什么?
3:
无符号整数使用“纯二进制”表示。
有符号整数有三个选项。两个可以被认为是过时的;最常见的是二进制补码。所有选项都要求正有符号整数值与等效的无符号整数值具有相同的表示形式。在二进制补码中,负有符号整数与通过添加UINT_MAX+1
等生成的无符号整数相同。
如果你想检查表示,那么做 unsigned char *p = (unsigned char *)&x; printf("%02X%02X%02X%02X", p[0], p[1], p[2], p[3]);
,取决于你的系统需要多少字节。
关于c - 在无符号整数之间进行减法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22901765/