【发布时间】:2011-09-07 02:40:10
【问题描述】:
这里有两个非常简单的程序。我希望得到相同的输出,但我没有。我不知道为什么。第一个输出 251。第二个输出 -5。我可以理解为什么是 251。但是,我不明白为什么第二个程序给了我 -5。
程序 1:
#include <stdio.h>
int main()
{
unsigned char a;
unsigned char b;
unsigned int c;
a = 0;
b= -5;
c = (a + b);
printf("c hex: %x\n", c);
printf("c dec: %d\n",c);
}
输出:
c hex: fb
c dec: 251
程序 2:
#include <stdio.h>
int main()
{
unsigned char a;
unsigned char b;
unsigned int c;
a = 0;
b= 5;
c = (a - b);
printf("c hex: %x\n", c);
printf("c dec: %d\n",c);
}
输出:
c hex: fffffffb
c dec: -5
【问题讨论】:
-
您的两个程序都尝试使用
%d格式说明符打印unsigned int值。这是非法的,并且行为未定义。为了有意义地printf和unsigned int值,您需要%u或任何其他需要unsigned int参数的说明符。%x很好,因为它需要unsigned int。但是%d是完全不能接受的。这就是您得到奇怪结果的部分原因。 -
真的吗?仍然应该解释为什么我得到了我得到的。
-
正如 AndreyT 解释的那样,行为是“未定义的”——这已经足够解释了。如果您研究二进制机器算术,您可以弄清楚为什么它会以这种方式工作,但是从技术上讲,您看到的结果不是必需的——机器可以合法地打印“potato”而不是“-5”,因为这种行为是“未定义”。
-
@user678392:真的,真的。正如我所说,您的代码会产生未定义的行为。对于所有有意义的手段和目的,它的行为本质上是随机的,或者充其量是特定于实现的。虽然肯定有可能对你“得到”的东西提出一个确定性的解释,但它没有任何用处。这是浪费时间。
标签: c math unsigned-integer integer-promotion