unsigned无符号、有符号类型的符号拓展

先看一段代码

#include <stdio.h>
main(){
unsigned
char a = 128; char b = a; printf("%d %d",a,b); return 0; }

 

a输出为128,b输出为-128。原因在于无符号类型和有符号类型像高精度转化时候不一样。

char类型长度是1个字节8位,而数字在计算机中是以补码形式存储的。 所以a=128在计算机内对应的值是0x80。把a赋给b,b的值也是0x80。

输出时候,printf会把a、b转化为int类型。而int类型是4个字节32位。关键在于char怎么转化为int。

转换的原则:有符号signed类型像高精度类型转换时候,符号位拓展;无符号unsigned类型像高精度类型转换时候,前面补0。

所以a是unsigned类型,char比int少了24位,在前面补0,a的值变成了0x0000 0080。

b是signed类型,在前面补1,b的值变成了0xFFFF FF80。

数字在计算机内是以补码形式存储的。

a的值是正数,补码是他本身,输出为128,b的补码求出来是-128。

 

转载于:https://www.cnblogs.com/betterluo/p/6084087.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值