更正:参考该文,对于一个字节的十六进制数来数,并没有越限。
我们在该文中已经分析了,字符数组中可以存储整型的情况。在前文中,我们说,字符中存储的最大值是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型指针的情况。