前言
各位在写代码的时候有没有想过,当数据类型带有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;
}
上述代码简单的输出了三个数据的数值:
由图大家可以知道
a=-1;
b=-1;
c=255;a和b的相同是由于vs环境下,默认为signed类型;它们与c之间的区别仅仅为简单的是否带unsigned。
想必各位在对unsigned没有足够的了解并且对于整型提升这一词语稍许忘记了。
unsigned是什么
unsigned是unsigned意为“没有标记过的”,在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;
}
以上就是所有的内容了,谢谢观看。