c - 小端和大端中 int 的地址是否相同?

标签 c pointers endianness memory-address

例如,如果我有一个整数数组。

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/

相关文章:

c - 需要在 Yahtzee 中重新启动计算机

c - 使用 void 函数指向数组

audio - 为什么在 WAV header 中同时使用小端和大端

c - 有符号整数的平台独立存储

java - DB2 事务日志

c - 一个 1024 位的 RSA 算法,用 C

c - C 程序错误 - 解释

c++ - 如何将常量指针传递给类中的方法

Java,在二进制文件输入中搜索 long,8 字节对齐,大端

c++ - #在C++代码中代表什么?