一、先看一段代码
#include<stdio.h>
int main()
{
int a = 3;
unsigned int b = -6;
printf("%d\n",a+b);
if ((a + b) > 0)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
运行结果是-
-3
yes
从这个代码中其实可以学到很多知识,且看我分析。
(1)unsigned int类型比Int 类型容量大,因为对于32\64位机器最前面一位对于Int类型而言均是符号位,而对于unsigned int类型最高位不是符号位是可以存数据的。
(2)在计算机中,负数的存储方式是以补码的形式储存。
(原码变反码就是符号位不变其他位按位取反,反码加1就是补码。需要注意正数的原反补码是相同的。)
(3)会进行自动类型转换。当unsigned int类型和Int 类型运算时,如果没有指出转化类型,它会进行隐式转换为unsigned int 类型。同时当两个类型运算要进行隐式转换时一般会转换成容量较大的那个,可能是因为没那么容易溢出吧。
由以上知识可知:
printf打印的是%d,是整形,所以unsigned int 会转换成Int类型,故a+b的值打印出就是3+-6=-3。
然而对于if()逻辑语句中的a+b中的int 类型便会转换为unsigned int 类型。-6对应的 int类型原码为10000000 00000000 00000000 00000110,所以反码是11111111 11111111 11111111 11111001,反码加一就是补码为11111111 11111111 11111111 11111010,故补码的这串数会直接放进unsigned int 中,对应数为4294967290再加上3为4294967293>0,所以输出为yes.
二、再看一段代码
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;
//输出结果是-1;-1;255
}
这里结果为什么是这样呢?
首先得知道:有符号数的最高位决定正负,正数补0,复数补1。
1、所以对于题中a和b的分析就是一样的,char只存8个bit位,截取的是最后8位补码为:1111 1111
当用%d打印时,进行类型转换,变为int类型,从左补1,所以打印时a的补码是:
11111111 11111111 11111111 11111111
补码减1为反码:
11111111 11111111 11111111 11111110
反码除符号位按位取反为原码:
10000000 00000000 00000000 00000001
打印结果就是-1;
2、对与c的打印就是在8位前补0为:
00000000 00000000 00000000 11111111
为正数原反补码相同则打印给果为256-1=255.
你学会了吗,欢迎评论区留言哦。