MFC atoi()函数转化出错。转化0x97为整数的的时候,返回的结果是-105

int ilenmic2;

sprintf(sznummic2,"%d",*(mic2datal+3));

ilenmic2=atoi(sznummic2);

mic2datal是个char数组,其内容为0x00,0x00,0x00,0x97

ilenmic2最后等于-105,不是应该151才对的吗,问题出在哪里?

看一下sznummic2的值吧,问题应该出在sprintf,你用%d应该是有问题的,这个只针对int才行。
或者你尝试一下:
int i = *(mic2datal+3);
从分析上看,这个更靠谱些追问

好像又是你?先谢谢了。若是sprintf的问题的话,我前面的代码也有这样用,但是没问题。然后,你那个,我试过,不行。
其实我的问题就是就是字符数组里保存有十六进制的数(总共4个字节,但有实际意义的一般是一个或者两个字节),要把它转成整数,有没有好些的方法,能否指点一下?
谢谢了。

追答

字符数组里保存有十六进制的数(总共4个字节,但有实际意义的一般是一个或者两个字节)
这个说法不严谨。
如果每个字节保存的是“数”而不是可显示的“字符”,那么是可以直接复制的。
char ch = (char)0x97;
int i = ch;
CString str;
str.Format("%d",i);
AfxMessageBox(str);
不过你的问题我找到了,呵呵,确实显示了-105,因为char是-128~127的取值范围,有符号的。
int i = (unsigned char)ch;
这样就显示151了。

追问

谢谢,第一个问题解决了。
我是这样
long i = *(mic2datal+3);
mic2datal里存放的是数组,我只取了第4个字节出来,如果是,我要去两个字节出来给怎样转呢?
我的字符数组里放的就是“数”来的,比如字符 数组0x00,0x00,0x0c,0x07,它存放的其实就是十进制数3079,然后我有函数要传这个参数进去,要求是整数,这个该怎样转呢?
直接复制指可以用memcpy等函数直接复制给一个变量?

追答

memcpy是可以的。
你需要注意的是,无论int(4字节)还是short(2字节)都是高低位反过来存储的。也就是说:
0x01 0x00 是short的 1
0x00 0x01 是short的 256
如果你的指针数组是这样存储的,那么直接memcpy就可以。
如果不是高低异位,那么就只能是这样
i1 = (unsinged char)*(mic+3);
i2 = (unsinged char)*(mic+2);
i = i2*256 + i1;

追问

谢谢了。

温馨提示:内容为网友见解,仅供参考
无其他回答

Warning: Invalid argument supplied for foreach() in /www/wwwroot/aolonic.com/skin/templets/default/contents.html on line 45
相似回答