计算机中整数都以补码的形式存储,int类型表示有符号的整型数,其最高位代表符号位,其余位数代表符号位;而unsigned int 类型表示无符号的整型数据,没有符号位,全部为数值位,那么int类型和unsigned类型之间是如何转化的呢?
- 以32位int型数据为例,先不讨论溢出情况,我们来看看它们之间是如何转化的。
先给出一道例题:
C语言中允许无符号数和有符号整数之间的转换, 下面是一段C语言代码:
Int x =-1;
Unsigned u=2^31;
Printf (“x=%u=%d\n”,x,x);
Printf (“u=%u=%d\n”,u,u);
给出在32位计算机中上述程序段的输出结果并分析原因.
答案为:
x=232-1=-1
x=231=-231
下面我们就来看看输出这个结果的原因是什么
首先,-1是一个int型在计算机里以补码的形式存放,它的补码是1000 0000…0000 0001,也就是第一位和最后一位为1,那么当他以%u的形式输出的时候,计算机会先将这个补码转换成原码(取反加一或者减一取反都行),然后将符号位当做数值位,这样就转化成无符号数的原码即无符号数的补码,因为无符号数默认都是正数,正数的补码就是原码.因此无符号输出的二进制数为1111 1111 …1111 1111即十进制232-1;
下面的231计算机里存储的是1000 0000…0000 0000 就是第一位为0,这是一个无符号数,那么转化成有符号数怎么办呢?首先计算机会去看这个数的最高位,如果是1,那么计算机会默认将这个数输出作负数,将剩下的位数作为数值位取反加一变成原码,还是1000 0000 …0000 0000,所以输出是-231
总结一下
|