为什么unsigned char c=-1打印出来的值是255

345 阅读3分钟

前言

  各位在写代码的时候有没有想过,当数据类型带有unsigned时输出的值是否会受到影响。经过我的测试,答案是有的,接下来就给大家看看到底会受到什么样的影响。

代码

#include<stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}

上述代码简单的输出了三个数据的数值:

image.png

由图大家可以知道 a=-1; b=-1; c=255;a和b的相同是由于vs环境下,默认为signed类型;它们与c之间的区别仅仅为简单的是否带unsigned。 想必各位在对unsigned没有足够的了解并且对于整型提升这一词语稍许忘记了。

unsigned是什么

  unsignedunsigned意为“没有标记过的”,在C语言中表示无符号的,与关键字signed对应**

unsigned的作用是:声明无符号的整数类型。

unsigned可以修饰的几种类型:

unsigned int a; 无符号整型

unsigned short b; 无符号短整型

unsgined char c; 无符号字符

unsigned long c; 无符号长整型

unsigned long long d; 无符号long long类型

整型提升是什么

  C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

1.负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
111111111111111111111111111

2.整数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001

3.//无符号整形提升,高位补0

  根据整型提升第三点我们可以知道无符号整形提升,高位补0。所以unsigned char c = -1这个代码进行整型提升时,我们就要在前面补0.得到的数据为:"000000000000000000000000011111111",转化成十进制就是255. 说到这儿,我们将代码需要理解的部分进行注释加强理解。

#include<stdio.h>
int main()
{
	char a = -1;
	//10000000000000000000000000000001  /原码
	//11111111111111111111111111111110  /取反
	//11111111111111111111111111111111  /加1
	//由于char类型只有一个字节(八个bit位),所以它只能存八个数
	//11111111  -a
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	//%d 是10进制为基本形式打印有符号的整数
	//111111111111111111111111111111111 整型提升a(补码)转换成原码打印
	//000000000000000000000000011111111 整型提升c
	return 0;
}

以上就是所有的内容了,谢谢观看。