unsigned int与int类型的数据进行数值运算后,得到的结果是什么类型的呢?
通过下例检验,为unsigned型:
#include <stdio.h>
int main()
{
unsigned int a = 1;
int b = -11;
if (a + b > 0)
printf("result is : unsigned int\n");
else printf("result is : int\n");
return 0;
}
如果运算符两边的运算数类型不同
- 先要将其转换为相同的类型,即较低级类型会转换为较高级类型
- 然后再参加运算,转换规则如下图所示:
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
参考转换规则
**那么上代码的运算结果是多少呢?**运算结果如下:
result is : unsigned int
a+b=4294967286
首先需要知道,数值在计算机中是以补码的形式存储的。
- 同时如果两个补码相加时,最高位也就是我们的符号位如果有进位,是需要丢弃的。
- 正数的补码是自己本身
- 负数的补码是符号位为1,其余位为该数绝对值的原码按位取反,然后整个数再加1
因此,在整个运算中,a(1)为unsigned,b(-11)转换为了unsigned,然后进行了相加。
b具体是怎么相加的,可以参考位运算符 | & ^ ~ && ||,补码,反码
下面以一个例子解释其转换:
我们给unsigned int 类型赋值-1,对其进行输出,结果为255,为什么不是-1呢?
1.8位二进制0000 0000
2.二进制在计算机中以补码形式存在
正数的补码就是它本身
负数的补码是对应正数的原码取反加1得到
3.-1的补码是 1的原码0000 0001 取反加1就是 1111 1111
4.unsigned是无符号数,所以把会1111 1111看成正数 255 因为255的二进制为(1111 1111)