免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1775 | 回复: 7
打印 上一主题 下一主题

[C] 一个简单的C类型转换问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-16 00:27 |只看该作者 |倒序浏览
0123456701234567012345670123456701234567012345670123456701234567
|   ->1<-  |         -->2<--       |                    --->4<---                      |

如上所示01234567分别表示一个字节的1-8位
如果一个char 数组chbuf[8] 存放了第一行的 8*8 位数据, 第二行分别表示为1 2 4个对应的字节, 那么以下语句是否正确, 如果是错误又是为什么:
char cval = chbuf[0];
short sval = *(short *)(chbuf + 1);
int ival = *(int *)(chbuf +3);

论坛徽章:
0
2 [报告]
发表于 2012-08-16 07:32 |只看该作者
回复 1# leecapacity
先不说取出来可不可以 我好奇的是你是怎么把这些字节存进去的

这么做的目的在于什么,为什么不用结构体呢


   

论坛徽章:
0
3 [报告]
发表于 2012-08-16 07:51 |只看该作者
回复 1# leecapacity
这种类型转换是可以的 不会有问题 但是转换的时候要注意字节序的问题 另外你是char的数字 转换为short和int时要转移在字符和数之间的转换(需要查ASCII表)


   

论坛徽章:
0
4 [报告]
发表于 2012-08-16 08:09 |只看该作者
回复 2# liuyang7078

这是我看到的一个面试的试题, 存放的是一种协议, 很有可能是网络协议, 该公司是搞网络底层研发的


   

论坛徽章:
0
5 [报告]
发表于 2012-08-16 09:05 |只看该作者
没问题~只要你清楚每个转出来的东西是什么就ok~

无非就是一个pos = 0,然后根据类型分别写转换,让pos += sizeof(T)之类的

论坛徽章:
0
6 [报告]
发表于 2012-08-16 10:30 |只看该作者
回复 2# liuyang7078 我干过这事情……  不过我是fopen的二进制文件,没有用转换这些(其实俺根本就没想到转换这方面),看到您的这个回复。 俺了解了,俺是侥幸了……  话说二进制文件还是蛮好的哈。


   

论坛徽章:
0
7 [报告]
发表于 2012-08-16 19:07 |只看该作者
回复 4# leecapacity
这个转换是完全可以的 因为无论你存储的何种类型 表示在存储器中肯定是二进制代码 所谓的类型只是在使用的时候 人为设计的 所以 你可以往内存里写入两个char(对应两字节)然后在对应的位置读出个short 存放时会按照char的规则把字符放到一个字节里面去 读出的时候 类型是short 所以会取连续的两个字节 这个时候好像要分大小端 我昨晚测试了一个例子 然后在char和short之间做了计算 发现刚好吻合  你可以写个例子


   

论坛徽章:
0
8 [报告]
发表于 2012-08-16 19:18 |只看该作者
回复 6# kelvin_fly
二进制文件是不加解释直接传给调用者  文本文件也是ASCII文件 内核会把它按7位ASCII解释成字符传给调用者(因为ASCII只使用7位,还有就是ASCII文件只使用0x20-0x79 外加LF CR TAB) 这个应该是两种文件的本质不同吧


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP