例如,如果我有一个整数数组。
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
?
我假设这对包括结构在内的所有类型都适用?
最佳答案
是的,如果您要存储 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。
更新: 为了进一步扩展这一点,结构本质上是原始类型的集合(例如,字节、整数、指向其他事物的指针等)。这些原始类型通常在内存中连续布局(对齐等有一些异常(exception))。因此,适用于上述 int/short 示例的规则同样适用于基本类型(例如,结构)的集合。
如果您开始访问变量的子部分,那么体系结构的字节序将很重要,但是如果您始终以正确的类型(例如 int、double 等)完整地处理事物,那么事物的存储方式下面应该是透明的。
关于c - 小端和大端中 int 的地址是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20220325/