整型提升和大小端字节序

以一个整形类型的数字1为例 他的二进制表示为

000000000000000000000000000000001;

而在计算机储存当中 他的数据保存为十六进制,即

0x 00 00 00 01

从左到右为数据的高位到低位,而计算机中的内存也对应着高内存到低内存,那么便有了大小端字节序的概念

大端字节序:指数据的高位保存在低地址处,数据的低位保存在高地址处

小端字节序:指数据的高位保存在高地址处,数据的低位保存在低地址处

那么我们如何判断我们所使用的vs在存储数据的时候是使用大端字节序还是小端字节序呢,我们可以创建一个char类型的指针指向整型类型的数字1,因为char*只能从高到低访问一个字节,所以我们便可以通过char指针访问1的第一个字节,对他解应用看看他是0还是1,从而判断它存储的大小端

代码如下:

char*p=NULL;//初始化指针
int a=1;
p=&a;//p指向a中的一个字节
if(*p)
printf("是大端");
else
printf("是小端");
//看看p解应用后访问的a中具体字节

那什么是整型提升呢

我们来看一段代码

int main(){
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("%d %d %d",a,b,c);

那么a,b,c的结果分别是多少呢;

我们知道,数字在内存中是以补码的形式储存起来的 -1的原码为

10000000 00000000 000000000 00000001

除了符号位也就是最高位以外按位取反 得到反码;

11111111 11111111 11111111 11111110;

反码加一得到补码

11111111 11111111 11111111 11111111;

然而char类型只能存储一个字节 所以会发生截断 取低位的一个字节 即

11111111

使用a进行计算或者以%d输出a的时候会进行整型提升看一个字节中最高位;若为1则前面加上三个比特位全为1jiayi的字节;最高位为0则前面补0

现在为11111111 最高位为1 故补完以后为

11111111 11111111 11111111 11111111为补码

再将它加一取反得到源码并输出 结果为-1;

同理 b和a一样也是会发生整型提升;char类型默认就是有符号的signed char;

而unsigned char 不会这样,因为定义时时将它设置为无符号字符型的 所以它认为被截取的最高位不是符号位而是数字位 所以整型提升时前面全补零

即用%d输出c时候会被提升为

00000000 00000000 00000000 11111111

最高位符号位为零 所以是正数 正数的原反补码都相同 所以直接输出为256

整型提升的意义是怎样的呢

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值