首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

唉,被符号变换坑了,白浪费了2天,上来给自己立个碑

2013-09-15 
唉,被符号转换坑了,白浪费了2天,上来给自己立个碑本帖最后由 dahuatttt 于 2013-09-14 01:03:58 编辑unsig

唉,被符号转换坑了,白浪费了2天,上来给自己立个碑
本帖最后由 dahuatttt 于 2013-09-14 01:03:58 编辑


unsigned char t[2];
t[0] = 0x50;
t[1] = 0xF9;
float a = ((t[1]<<8)| (0x00ff&(int)t[0]))/32768.f;
cout << hex<<  *(int*)&a << endl;
// 输出3FF95000

char t[2];
t[0] = 0x50;
t[1] = 0xF9;
float a = ((t[1]<<8)| (0x00ff&(int)t[1]))/32768.f;
cout << hex<<  *(int*)&a << endl;
// 输出BD560000

因为一直使用BYTE类型,根本没去考虑BYTE实际上是unsigned char,导致总以为别的地方出了错,很久没查出问题来。

立个墓碑默哀一下。
[解决办法]
参加算术运算的时候又类型提升,这里int能表示下,所以t[1]提升为int。
char一般是有符号的,提升时补符号位。
unsigned char无符号,提升时补0。
[解决办法]
白浪费了2天???  难以想象,看下生成的汇编,不就一下真像大白了?
[解决办法]

    unsigned char t[2];
    t[0] = 0x50;
004113DE  mov         byte ptr [t],50h  
    t[1] = 0xF9;
004113E2  mov         byte ptr [ebp-7],0F9h  
    float a = ((t[1]<<8)
[解决办法]
 (0x00ff&(int)t[0]))/32768.f;
004113E6  movzx       eax,byte ptr [ebp-7]    
004113EA  shl         eax,8  
004113ED  movzx       ecx,byte ptr [t]  

其实就是movzx和movsx指令的区别

    char t1[2];
    t1[0] = 0x50;
00411454  mov         byte ptr [t1],50h  


    t1[1] = 0xF9;
00411458  mov         byte ptr [ebp-1Fh],0F9h  
    float a1 = ((t1[1]<<8)
[解决办法]
 (0x00ff&(int)t1[1]))/32768.f;
0041145C  movsx       eax,byte ptr [ebp-1Fh]  
00411460  shl         eax,8  
00411463  movsx       ecx,byte ptr [ebp-1Fh]  


[解决办法]

这个bug比较常见吧!在c专家中有专门介绍的。。
楼主不该啊
[解决办法]
引用:
白浪费了2天???  难以想象,看下生成的汇编,不就一下真像大白了?

2天肯定是在定位错误位置,最后才找到这段代码,不可能一直在瞪着这段代码吧
[解决办法]
话说这是 在做单片机么?...
[解决办法]
这个标准是未定义的, 但通常都是有符号数填充符号位.

热点排行