例如,如果我有一个整数数组。
int arr[3] = { 1 , 2 , 3 } ;
unsigned char * a = ( unsigned char* )&arr[0] ;
printf("%d " , *( int* )a ) ;
a += sizeof( int ) ;
printf("%d " , *( int* )a ) ;
a += sizeof( int ) ;
printf("%d " , *( int* )a ) ;
此代码是否会在大端和小端架构上生成1 2 3
?
我认为这适用于包括结构在内的每种类型?
答案 0 :(得分:2)
是的,如果你要存储int值,然后再重新检索那些相同的int值,那么它们如何存储在下面并不重要(例如,大/小端)。
例如,假设您定义
int a = 0xaabbccdd;
在小端系统上,它将作为 0xdd 0xcc 0xbb 0xaa 存储在内存中。在大端系统上,它将存储为 0xaa 0xbb 0xcc 0xdd 。但是,当您将此内存视为 int 时,它将始终被视为0xaabbccdd。现在,如果您查看了原始内存的子部分(例如,内存中int值的子部分),则会发生字节序。例如,假设您只读取存储int的内存位置的前两个字节:
int *ptr = &a;
short firstTwoBytesInMemory = *(short*)ptr;
firstTwoBytesInMemory的值在小端系统上为0xccdd,在大端系统上为0xaabb。
<强>更新强> 为了进一步扩展,结构本质上是基本类型的集合(例如,字节,整数,指向其他东西的指针等)。这些原始类型通常连续地在存储器中布局(对齐等一些例外)。因此,适用于上述int / short示例的相同规则适用于基本类型的集合(例如,结构)。
如果你开始访问变量的子部分,那么体系结构的字节顺序就会很重要,但是如果你总是处理它们正确类型的东西(例如,int,double等),就像存储事物一样下面应该是透明的。
答案 1 :(得分:1)
你的假设是正确的。 在给定的体系结构上,除非您明确使用endianess转换函数来修改值,否则不会出现endianess问题。 在LE和BE架构(通常是PC和便携式设备)之间交换信息时会出现endianess问题。 在你的情况下,你将int *转换为(unsigned char *),并将(unsigned char *)转换回(int *),这会在指针被取消引用时不影响实际数据(int数组的内容)。转换是在指针上进行的,而不是在int本身上进行的。