字符指针强制类型转换为uint16_t/uint8_t型指针(即使char类型越限了,也能取得原值(正确的值))-----通信中经常用到!!

更正:参考该文,对于一个字节的十六进制数来数,并没有越限。

我们在该文中已经分析了,字符数组中可以存储整型的情况。在前文中,我们说,字符中存储的最大值是127,超过127,输出越限,字符为乱码,如下图所示

但是,当我们将字符指针强制转换成int*,然后再解引用*,得到的int值,就可以越限了

原因是:char数组中,存储在char类型中的数据,虽然越限了,但存储的二进制数是不变的,

从数组中取出这个数时,当我们使用char,或者int8_t,肯定是个越限值,但是当我们使用uchar 或者uint8来取这个数时,是没有问题的。换句话说,输出是个什么值,关键看是用什么类型来取。

int main()
{
    char ch[4]={0xAA,0x11};
    printf("%d\n",*ch);
    printf("%x\n",*ch);
    printf("%d\n",*(uint8_t*)ch);//十进制
    printf("%x\n",*(uint8_t*)ch);//十六进制
    printf("%d\n",*(uint16_t*)ch);//十进制
    printf("%x\n",*(uint16_t*)ch);//十六进制
    return 0;
}

 注意:直接输出printf("%x\n",*ch); 是-86的十六进制数,ffffffaa,也是一个越限负数的十六进制数。

所以,对于存储在char类型中的越限数字,要想取出原值的话,都需要先进行强制类型转换。

分析:

1)我们将ch字符强制转换类型为uint8_t*的类型,解引用后,获得的最大值为255了。 

2)我们将ch字符强制转换类型为uint16_t*的类型(指向两个字节类型的指针)后,解引用后,可以获得两个字节的数据,即将ch[0]和ch[1]的数据合并为一个unit16_t数据,因为是高地址存放的是高字节,低地址存放的是低字节,所以,ch[1](0x11)存放unit16_t的高位,ch[0](0xaa)存放unit16_t的低位。这其实是主机字节序方式。

为了获取到与书写顺序相同的值0xAA11,我们会将其进行字节序转换:htons((uint16_t*)ch);

注意:char数组存储的整型常量,转化为十进制unit16_t时,此整型常量为十六进制形式,如果是十进制的话,也需要先转换成十六进制再进行类型转换(因为实质是都要转换成二进制码)。

我们在下文中分析字符指针转换成int型指针的情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值