关于大端和小端中的一个强制转化问题。
#include <stdio.h>int main()
{
int a = 0x1234;
char *b = (char *)&a;//已知int 为4个字节,在这里进行强制转化为char 时,是否会溢出?然后把int 中的第一个字节中的两个16进制数传递给*b ?
if (*b == 0x12)//在这里*b应该是字符型 ,为什么却和要和整形数据作比较?
{
printf("大端!\n");
}
else
{
printf("小端!\n");
}
return 0;
}
//这是一个小测试,结果如图。按照我的理解int的四个字节第一个传给char形,余下溢出传给m之后的地址中,但我经测试后结果却很奇怪,m之后的结果和我想的并不一样,同时结果显示的4我也很奇怪,为什么会这样?
#include <stdio.h>
int main()
{
int i = 0x1234;
char *m = (char *)&i;
char *p = (char *)(m + 1);
printf("%c\n", *m);//
printf("%c\n", *(p - 1));//
printf("%c\n", *p);//
return 0;
} 本帖最后由 jackz007 于 2019-12-4 18:20 编辑
姬世鹏 发表于 2019-12-4 16:49
我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理?
整型数 0x12345678 内存中占用 4 个字节空间,对于 Little Endian 架构的机器而言,这 4 个字节在内存中的存储顺序是 78 56 34 12
这一点,可以通过下面的程序进行证明:
#include <stdio.h>
int main()
{
int i = 0x12345678 ;
char * m = (char *) & i ;
printf("%02x %02x %02x %02x\n\n" , * m , *(m + 1) , * (m + 2) , * (m + 3));
}
编译、运行实况:
C:\Bin>g++ -o x x.c
C:\Bin>x
78 56 34 12
C:\Bin>
正如你所见,根本就没有什么整型数到 char 型的转化,我们所做的,只是把构成这个整型数的 4 个 char (byte)按顺序显示出来了而已。 本帖最后由 jackz007 于 2019-12-4 10:59 编辑
我想,你希望看到的应该是这个:
#include <stdio.h>
int main()
{
union {
char c = {0x12 , 0x34} ;
intx ;
} d ;
int i = 0x1234 ;
char * m = (char *) & i ;
if(d . x == 0x1234) printf("\tBig Endian machine.\n") ;
else printf("\tLittle Endian machine.\n") ;
printf("\t%04x\n" , d . x) ;
printf("\t%02x\n", * m) ;
printf("\t%02x\n", * (m + 1)) ;
return 0 ;
}
编译运行实况:
C:\Bin>g++ -static -o x x.c
C:\Bin>x
Little Endian machine.
3412
34
12
C:\Bin>
把一个数显示成字符 ("%c") 那自然是什么也看不出来,但是,如果显示成十六进制数那就完全不同了。 jackz007 发表于 2019-12-4 10:56
我想,你希望看到的应该是这个:
编译运行实况:
我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理? 姬世鹏 发表于 2019-12-4 16:49
我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理?
int 作为一个四字节的有符号类型,在其盛放不同长度的数值时,它的字节占用情况是怎样的? jackz007 发表于 2019-12-4 18:17
整型数 0x12345678 内存中占用 4 个字节空间,对于 Little Endian 架构的机器而言,这 4 个字 ...
万般感谢
页:
[1]