从计算机数值存储角度看,int类型和unsigned类型数据的转化

计算机中整数都以补码的形式存储,int类型表示有符号的整型数,其最高位代表符号位,其余位数代表符号位;而unsigned int 类型表示无符号的整型数据,没有符号位,全部为数值位,那么int类型和unsigned类型之间是如何转化的呢?

  1. 以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

在这里插入图片描述

总结一下
(1)无符号整数转换为有符号整数 : 看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。 (2)有符号整数转换为无符号整数: 看有符号数的最高位是否为1,如果不为1(为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。 总结:有符号数与无符号数之间的转换,都要看要转换的数的最高位是否为1,如果不为1,则转换结果就是要转换的数的本身;如果为1,则转换结果就是转换的数(看作是负数)的补码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值