use*_*392 3 c math integer-promotion unsigned-integer
这是两个非常简单的程序.我希望得到相同的输出,但我没有.我无法弄清楚为什么.第一个输出251.第二个输出-5.我可以理解为什么251.但是,我不明白为什么第二个程序给了我-5.
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
c hex: fb
c dec: 251
Run Code Online (Sandbox Code Playgroud)
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
c hex: fffffffb
c dec: -5
Run Code Online (Sandbox Code Playgroud)
R..*_*R.. 12
在第一个程序中,b=-5;分配251到b.(转换为无符号类型总是减少模1的值加上目标类型的最大值.)
在第二个程序中,b=5;简单地指定5 b,然后由于默认促销而c = (a - b);执行减法0-5 作为类型int - 简单地说,"小于int"类型总是int在被用作算术和按位运算符的操作数之前被提升.
编辑:我错过了一件事:由于c有类型unsigned int,第二个程序中的结果-5将转换为执行unsigned int赋值时的c结果,从而产生UINT_MAX-4.这是您使用说明%x符所看到的内容printf.打印c时%d,您会得到未定义的行为,因为%d需要一个(带符号)int参数,并且您传递的unsigned int参数的值在plain(signed)中是不可表示的int.