关于类型转换的一个问题
char m;
int n
m = (char)n
和
m = n & 0xff;
等效吗?
我觉得和字节序有关.
问题点数:5、回复次数:9Top
1 楼jackexu()回复于 2006-12-01 08:29:39 得分 1
等效Top
2 楼main25()回复于 2006-12-01 08:48:33 得分 0
是等效的啊!Top
3 楼my_web(交流qq:517664276)回复于 2006-12-01 09:36:30 得分 0
原理不一样,结果一样,你想问什么?Top
4 楼augustusqing(喜欢雨路的火焰狼)回复于 2006-12-01 09:45:14 得分 0
m = n&0xff ,编译器会来一步 m = (char)(n&0xff),是吧。Top
5 楼lockhall(唐朝 为了猥琐而努力学习)回复于 2006-12-02 09:49:31 得分 0
yes.等效
在很多情况下,用这种&来操作还是很多的Top
6 楼xddzccn(一个人旅行)回复于 2006-12-02 10:27:50 得分 0
main()
{
char test_1;
char test_2;
int n=0x5689;
test_1 = (char)n;
test_2 = n & 0xff;
printf("test_1=%x\n",test_1);
printf("test_2=%x\n",test_2);
}
是一样的输出ffffff89
main()
{
unsigned char test_1;
unsigned char test_2;
unsigned int n=0x5689;
test_1 = (char)n;
test_2 = n & 0xff;
printf("test_1=%x\n",test_1);
printf("test_2=%x\n",test_2);
}
这样就输出89
为什么,还要请教一下高手阿
Top
7 楼studying(学到老)回复于 2006-12-02 10:54:25 得分 4
在VC8的debug模式下编译的汇编代码如下:
m1 = (char)n;
00411385 mov al,byte ptr [n]
00411388 mov byte ptr [m1],al
m2 = n & 0xff;
0041138B mov eax,dword ptr [n]
0041138E and eax,0FFh
00411393 mov byte ptr [m2],al
byte ptr [n]就是取n的最低位的byte,和and eax,0FFh没有什么区别。
对于你说的字节顺序,虽然每个平台会有有所区别,但是平台自己会正确的处理的,不需要担心
对于为什么输出ffffff89和89,这时因为在第一个main中你定义的test1和test2为有符号的char,在转换成%x的时候会有一个符号扩展的问题,又因为此时test1的值为89,首位为1,所以符号扩展的结果就是ffffff89;如果test1的值为79,那么输出的就是79了,而不是ffffff79。而第二个main定义的是无符号的char,不会进行符号的扩展,所以就是89了。Top
8 楼zhangrui23733()回复于 2006-12-02 14:55:33 得分 0
将int强转成char可能会引起问题的.
强转要小心Top
9 楼sevenzeal(I`m Pointer .Pointer is heart.So S=NULL)回复于 2006-12-02 18:43:07 得分 0
学习了Top





