在C中添加无符号整数

use*_*392 3 c math integer-promotion unsigned-integer

这是两个非常简单的程序.我希望得到相同的输出,但我没有.我无法弄清楚为什么.第一个输出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);

}
Run Code Online (Sandbox Code Playgroud)

输出:

c hex: fb
c dec: 251
Run Code Online (Sandbox Code Playgroud)

计划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);

}
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.