关于int(short)向unsigned char类型转换问题请教。

idleguy 2005-01-17 12:38:20
在int向unsigned char转换过程中遇到一个问题,向各位请教。

代码:

short x=0x00c3;//为了描述方便,用十六进制表示.195

unsigned char *tmp=(unsigned char*)&x;

for (uint y=0;y<sizeof(short);++y)
{
cout<<*(tmp+y)<<endl;
}

*(tmp+y)所得到的值总是为0

但是如果
short x=0x01c3;
那么*(tmp+1)可以得到01.

再令
short x=0x01ff.
那么*tmp=ff,*(tmp+1)=01
结果就是正确的。

也就是说,short中的最低字节如果不是ff,转换以后都变成了00.

winxp vs.net

请问这是为什么,如何才能将int/short按字节转换为unsigned char?

请各位高手指点,谢谢。
...全文
980 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WingForce 2005-01-17
  • 打赏
  • 举报
回复
不明白意思

short x=0x00c3
unsigned char *tmp=(unsigned char*)&x;
*tmp = 0xc3, *(tmp + 1) = 0x0
没有错
goodluckyxl 2005-01-17
  • 打赏
  • 举报
回复
memcpy
idleguy 2005-01-17
  • 打赏
  • 举报
回复
谢谢各位老大的帮助,我已经解决问题了。这完全是一个误会。

描述一下过程。

问题的背景是在QT下写一个Ascii到Ebcdic的转换。

在往文件中写的时候,用的是QDataStream::operator <<,而不是writeRawBytes(),造成写入的时候在流中operator <<自动加上了写入长度,比如00000020。从而造成了我认为我的转换有错误。

很凑巧的,在调试程序过程中,我看到调试信息里面unsigned char得到的值显示也是00,和写入文件的第一个字节一样,所以我就认为是类型转换出错。一直在这里找问题。

最后发现如果用writeRawBytes()函数,虽然调试过程中显示的还是00,但是写入文件的内容却是正确的,也就是说,调试信息错误,实际值是正确的。

因此,我只修改了一个函数就解决了问题。和QT以及数据类型转换都没有关系。

感谢各位帮我想办法。结贴。谢谢各位。

ilovevc 2005-01-17
  • 打赏
  • 举报
回复
那你不用0xC3,你用0x65呢?看看这些可打印字符是否能显式出来。
idleguy 2005-01-17
  • 打赏
  • 举报
回复
谢谢piaozi2003,我现在其实就是想用1个字节来存储一个0-255之间的数。

所以显示出什么我不关心,我只是想要得到这个字节里面的内容是0xc3...

可是现在这个字节里面的内容是0x00...很是郁闷。

同事没有用QT编译了一下,得到了正确结果,我这里不用QT也有问题,看来是个案。跟QT无关。

这么说吧,我现在在我的环境下,写:

unsigned char c=0xc3;

调试的时候,c=0x00

-_-...

抓狂...
piaozi2003 2005-01-17
  • 打赏
  • 举报
回复
我上面说错了,是不是Qt把char类型默认改为了unicode,所以输出了195的ASCⅡ码?
正常情况下显示一个字节应该是没有问题的。
piaozi2003 2005-01-17
  • 打赏
  • 举报
回复
cout<<*(tmp+y)<<endl;

这里tmp是一个unsigned char*, 所以*tmp被解释为unsigned char,所以输出的应该是195的ASCⅡ码,大于127的ASCⅡ如何显示跟具体系统和文本编辑器有关!
idleguy 2005-01-17
  • 打赏
  • 举报
回复
恐怕是QT底层的问题。

我在windows + vs.net + QT 3.3.3下编译的。

不用QT结果就是正确的,但是用了QT就是错误的,两个变量(x和c)的地址一样,但是内容却不一样。

我继续抓狂....
WingForce 2005-01-17
  • 打赏
  • 举报
回复
你在什么环境下用的?
x86平台反正没有问题
idleguy 2005-01-17
  • 打赏
  • 举报
回复
抓狂ing...

用memcpy如下:
int x=0xc3
unsigned char *tmp=new unsigned char[4];
memcpy(tmp,&x,4);

*tmp应该是0xc3啊,为什么还是0x00?

*(tmp+y)全都是0x00..(y=[0,3])

各位高手,请指教,谢谢。
idleguy 2005-01-17
  • 打赏
  • 举报
回复
to: WingForce(初六,履霜,坚冰至。)

现在的问题是,*tmp和*(tmp+1)都等于0x00...所以才郁闷的。

to:goodluckyxl(被人遗忘的狗)

memcpy,我去试一下。因为做的东西需要跨平台(用的QT),所以我不知道memcpy是不是会有影响。

to:suyouxin(为什么划船不用浆)

sprintf,我去试一下。

谢谢楼上各位。能告诉我我的转换错在什么地方了么?为什么会有这种结果?
suyouxin 2005-01-17
  • 打赏
  • 举报
回复
sprintf(tmp, "%i", x);

65,185

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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