c类型转换char2short
来源:互联网 发布:平板软件 编辑:程序博客网 时间:2024/06/11 16:43
1. 程序如下:
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <arpa/inet.h>int main(int argc, char *argv[]){char a[] = { 4, 8, 3, 2, 7, 9, 1 };printf("little-endian=%d, big-endian=%d\n", *((short *)a+1), htons(*((short *)a+1)));struct test{unsigned short a:4;unsigned short b:5;unsigned short c:7;}gg;gg.a = 2;gg.b = 3;gg.c = 0;printf("==%d\n", *((short *)&gg));int hexInt = 0x12345678;printf("===0x%x\n", *((char *)&hexInt));return 0;}
2. 运行结果(x86):
little-endian=515, big-endian=770
==50
===0x78
3. 分析:
涉及多字节数据在内存存储大小端问题;所谓大端,MSB,即是内存低地址存数据的高位,高地址存数据低位;而小端LSB,内存低地址存数据低位,内存高地址存数据高位;但给人看的时候大端比较符合我们的阅读顺序。 一般的x86采用小端模式,而网络传输采用大端模式。
*((short *)a+1) 即是数组a转换为short类型再加1的地址处的short值等于多少, 即a[2]=3,a[3]=2所表示short值,因x86cpu小端模式:
3 : 11000000 (低位)
2 : 01000000 (高位)
11000000 01000000 =》 00000010 00000011 == 2^9 + 2^1 + 2^0 = 512 + 2 + 1 = 515
同理大端模式:
3: 00000011 (高位)
2: 00000010 (低位)
00000011 00000010 == 2^9 + 2^8 + 2^1 = 512 + 256 + 2 = 770
那么 *((short *)&gg)你会分析了吧? 仅依小端模式说明:
2 : 0100 (低位)
3 : 11000
0 : 0000000 (高位)
0000000 00011 0010 == 2^4 + 2^5 + 2^1 = 16 + 32 + 2 = 50
0x12345678 的小端模式第一个char即是0x78 而大端模式即为0x12;
那现在大小端和类型转换问题算是明了了。
- c类型转换char2short
- <C/C++> 类型转换
- C/C++:类型转换
- C类型转换
- C#.NET 类型转换
- 类型转换(C#)
- C指针类型转换
- 类型转换--c语言
- C语言类型转换
- C语言类型转换
- C/C++类型转换
- C语言类型转换
- C++_类型转换
- objective-c 类型转换
- objective-c类型转换
- 标准C 类型转换
- c类型转换
- C类型转换
- CentOS常用用户管理命令
- POJ 1151 扫描线+线段树+离散化
- eclipse 开发JNI
- 第24贴:经典接法三极管电路的静态计算
- .net基础问题
- c类型转换char2short
- 一条进程的栈区、堆区、数据区和代码区在内存中的映射
- 再论JAVA中的核心数据——Map&Set
- ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
- vs快捷键
- java时间戳
- 解决Java中URL传递中文参数时出现乱码的问题
- 让人神经的爱情
- IOS5下的bug