请教unsinged char a[2] 转化为unsigned short k; C或C++均可

Jerry_Lee01 2013-04-09 05:28:31
unsinged char a[2];
unsigned short k;
a[0] = 0;
a[1] = 8;
k = (unsigned short)a;
printf("%d \n",k);

问题在哪啊?期待大家释疑!
...全文
342 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-04-16
  • 打赏
  • 举报
回复
unsinged char a[2];
 unsigned short k;
 a[0] = 0;
 a[1] = 8;
 k = *(unsigned short *)a;
 printf("%d \n",k);
或
unsinged char a[2];
unsinged char b[2];
 unsigned short k;
 a[0] = 0;
 a[1] = 8;
b[0]=a[1];b[1]=a[0];
 k = *(unsigned short *)b;
 printf("%d \n",k);
Jerry_Lee01 2013-04-16
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹……
我调试过程中发现65532和512在调试信息中没有65532和512的影子,是串口的特性还是别的原因呢?另外也不是高地位反了,设备和PC机都是小端的。恳请大牛指点
Athenacle_ 2013-04-10
  • 打赏
  • 举报
回复
引用 7 楼 starytx 的回复:
引用 6 楼 nice_cxf 的回复:引用 5 楼 starytx 的回复: 引用 3 楼 woxiaozhi 的回复:谢谢一楼,二楼的指导,可是问题尚未解决。 程序的拓扑是:外部设备-------(串口)---------PC机 外部设备通过串口线发送BYTE型(实际是unsigned char)的数据到PC机,PC机上VC6.0中通过CSCOmm控件接受,然后……
结果正确,那么转换过程正确么?假设a[2]后面有很多很多个非零字符,会不会直接访问到不能访问的地方呢? 那有没有想过,atoi的结果太大,short放不下呢?
starytx 2013-04-10
  • 打赏
  • 举报
回复
引用 6 楼 nice_cxf 的回复:
引用 5 楼 starytx 的回复: 引用 3 楼 woxiaozhi 的回复:谢谢一楼,二楼的指导,可是问题尚未解决。 程序的拓扑是:外部设备-------(串口)---------PC机 外部设备通过串口线发送BYTE型(实际是unsigned char)的数据到PC机,PC机上VC6.0中通过CSCOmm控件接受,然后转化为unsigned short 类型的。 注:转化前打印出来……
是没有结束符,如果单纯显示的话尾部会有乱码,不过只要尾部的乱码不是数字这样转化的结果还是正确的。保险起见定义3个长度的BYTE加上结束符
nice_cxf 2013-04-10
  • 打赏
  • 举报
回复
引用 5 楼 starytx 的回复:
引用 3 楼 woxiaozhi 的回复:谢谢一楼,二楼的指导,可是问题尚未解决。 程序的拓扑是:外部设备-------(串口)---------PC机 外部设备通过串口线发送BYTE型(实际是unsigned char)的数据到PC机,PC机上VC6.0中通过CSCOmm控件接受,然后转化为unsigned short 类型的。 注:转化前打印出来时正常的02 ……
怎么可以用atoi?a根本没结束符,这样结果不可知
starytx 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 woxiaozhi 的回复:
谢谢一楼,二楼的指导,可是问题尚未解决。 程序的拓扑是:外部设备-------(串口)---------PC机 外部设备通过串口线发送BYTE型(实际是unsigned char)的数据到PC机,PC机上VC6.0中通过CSCOmm控件接受,然后转化为unsigned short 类型的。 注:转化前打印出来时正常的02 通过一楼的方法,编译通过,结果不对,我串口发过来的是02,转化后变成……
你要先搞清楚你发送的时候是个啥东西,2个元素的BYTE数组?每个元素的值分别是0,2还是'0','2'这是不一样的,如果按照上边两个方法转换过来肯定不会是原来的02,或者20.如果你的意思是转换结果无符号short的值也是02,可以这样
    BYTE a[2];
    unsigned short k;
    a[0] = '0';     // 注意这里的值是字符'0'
    a[1] = '2';     // 注意这里的值是字符'2'
    k = atoi((char*)a); // 字符串转化为数字
    printf("%d \n",k);
nice_cxf 2013-04-10
  • 打赏
  • 举报
回复
竟然是ascii。。。。看来是先高位后低位 k=(a[0]-'0')<<8 | (a[1]-'0')
Jerry_Lee01 2013-04-10
  • 打赏
  • 举报
回复
谢谢一楼,二楼的指导,可是问题尚未解决。 程序的拓扑是:外部设备-------(串口)---------PC机 外部设备通过串口线发送BYTE型(实际是unsigned char)的数据到PC机,PC机上VC6.0中通过CSCOmm控件接受,然后转化为unsigned short 类型的。 注:转化前打印出来时正常的02 通过一楼的方法,编译通过,结果不对,我串口发过来的是02,转化后变成一个5位数,12848 二楼的方法,编译通过,结果和一楼的一样,也是一个5位数11312 求有效方法。。。
赵4老师 2013-04-10
  • 打赏
  • 举报
回复
电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
Jerry_Lee01 2013-04-10
  • 打赏
  • 举报
回复
引用 11 楼 andyfcl 的回复:
高低位反了吧。 unsigned char acBuff[2] = {'0', '2'}; unsigned short nResult = (((acBuff[0] - '0') << 8) | (acBuff[1] - '0')); 如果数组acBuff[2]={'2','0'};那得到的值才会是512;
那65532是什么呢?
andyfcl 2013-04-10
  • 打赏
  • 举报
回复
高低位反了吧。 unsigned char acBuff[2] = {'0', '2'}; unsigned short nResult = (((acBuff[0] - '0') << 8) | (acBuff[1] - '0')); 如果数组acBuff[2]={'2','0'};那得到的值才会是512;
Jerry_Lee01 2013-04-10
  • 打赏
  • 举报
回复
引用 8 楼 Athenacle_ 的回复:
引用 7 楼 starytx 的回复: 引用 6 楼 nice_cxf 的回复:引用 5 楼 starytx 的回复: 引用 3 楼 woxiaozhi 的回复:谢谢一楼,二楼的指导,可是问题尚未解决。 程序的拓扑是:外部设备-------(串口)---------PC机 外部设备通过串口线发送BYTE型(实际是unsigned char)的数据到PC机,PC机上VC6.0中通过CSCOm……
用atoi肯定不行,我用vc6.0编译没通过。
Jerry_Lee01 2013-04-10
  • 打赏
  • 举报
回复
引用 4 楼 nice_cxf 的回复:
竟然是ascii。。。。看来是先高位后低位 k=(a[0]-'0')<<8 | (a[1]-'0')
结果中除了我想要的还有其他数据; CString temp; unsigned short k; k=(a[0]-'0')<<8 | (a[1]-'0') temp.Format("%d \n",k); m_rxd += temp; 在静态文本控件中显示的是: 2 65532 512 我只想获取2, 剩下的数据是怎么带出来的,该如何滤掉?
nice_cxf 2013-04-09
  • 打赏
  • 举报
回复
没仔细看,原先写法就错了,应该是 k = *(unsigned short*)a;
nice_cxf 2013-04-09
  • 打赏
  • 举报
回复
大小端问题,你觉得结果应该是什么呢? 如果不想知道大小端,假定1为高位,k=a[1]<<8 | a[0];否则类似

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧