读书人

唉被符号变换坑了白浪费了2天上

发布时间: 2013-09-15 19:58:13 作者: rapoo

唉,被符号转换坑了,白浪费了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天肯定是在定位错误位置,最后才找到这段代码,不可能一直在瞪着这段代码吧
[解决办法]
话说这是 在做单片机么?...
[解决办法]
这个标准是未定义的, 但通常都是有符号数填充符号位.

读书人网 >C++

热点推荐