关于char和int的一道试题

这是我刚入职时遇到的一道考题:

设a为char类型,b为int类型,那么a = (char)b等效于 a = b & 0xff;       √
设a为char类型,b为int类型,那么a = (char)b等效于 a = *(char *)&b;    ×   

在论坛上请教了一些高手,现在总结一下,如有错误还希望指正一下。

设a为char类型,b为int类型,那么a = (char)b等效于 a = b & 0xff;       √
假设b = 0x12345678,a = (char)b等价于取b地址的第一个字节,0xff应该当作一个整型来看待,即0x000000ff. 

假设存储是little-endian,那么在内存中b的实际存储为78 56 34 12,0xff为ff 00 00 00,那么b & 0xff在内存中是78 00 00 00,元算后又得转换显示出00 00 00 78即78.

假设存储是big-endian,那么在内存中b的实际存储为12 34 56 78,0xff为00 00 00 78,那么 b & 0xff在内存中是00 00 00 00 78,运算后不需转换显示出00 00 00 78. 由此我想到一点,就是little-endian的存储需要两次转换,而big-endian的存储不需要转换。设a为char类型,b为int类型,那么a = (char)b等效于 a = *(char *)&b;


设a为char类型,b为int类型,那么a = (char)b等效于 a = *(char *)&b;    ×   
(char*)&b等价于取b的地址,然后把这个整型转换成char*的地址,这个地址指向b的首地址,所以a = *(char*)&b就相当于取b第一个地址所存储的数值。

假设b = 0x12345678
假设为little-endian,那么b在内存中是78 56 34 12,因此,此时a = 78;正确
假设为big-endian,那么b在内存中是12 34 56 78,因此,此时a = 12;错误

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值