如果我有以下代码:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
我会得到 i 的 LSB 地址还是 MSB?
平台之间的行为会有所不同吗?
C和C++之间有区别吗?
如果我有以下代码:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
我会得到 i 的 LSB 地址还是 MSB?
平台之间的行为会有所不同吗?
C和C++之间有区别吗?
考虑大小int
为 4 个字节。总是&i
会给你这 4 个字节的第一个地址。
如果架构是小端,那么低地址将具有如下所示的 LSB。
+------+------+------+------+ 地址 | 1000 | 1001 | 1002 | 1003 | +------+------+------+------+ 价值 | 5 | 0 | 0 | 0 | +------+------+------+------+
如果架构是大端,那么低地址将具有如下所示的 MSB。
+------+------+------+------+ 地址 | 1000 | 1001 | 1002 | 1003 | +------+------+------+------+ 价值 | 0 | 0 | 0 | 5 | +------+------+------+------+
所以&i
会给出i
if little endian的LSB地址,或者给出i
if big endian的MSB地址
在混合端模式下,将为每个任务动态选择小端或大端。
下面的逻辑会告诉你字节序
int i = 5;
void * ptr = &i;
char * ch = (char *) ptr;
printf("%p", ptr);
if (5 == (*ch))
printf("\nlittle endian\n");
else
printf("\nbig endian\n");
这种行为对于两者都是相同c
的c++
我会得到 i 的 LSB 地址还是 MSB?
这取决于平台:它将是最低寻址字节,可能是 MSB 或 LSB,具体取决于您平台的字节序。
虽然这没有直接写在标准中,但这是第 6.3.2.3.7 节所暗示的内容:
当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。
平台之间的行为会有所不同吗?
是的
c和c ++之间有区别吗?
否:它在 C 和 C++ 中都依赖于平台
这取决于平台的字节顺序;如果是 little-endian 平台,您将获得指向 LSB 的指针,如果是 big-endian 平台,它将指向 MSB。甚至还有一些混合端平台,在这种情况下,愿上帝怜悯你,检查编译器/CPU 的特定文档。
不过,您可以在运行时执行快速检查:
uint32_t i=0x01020304;
char le[4]={4, 3, 2, 1};
char be[4]={1, 2, 3, 4};
if(memcmp(&i, le, 4)==0)
puts("Little endian");
else if(memcmp(&i, be, 4)==0)
puts("Big endian");
else
puts("Mixed endian");
顺便说一句,要打印指针,您必须使用%p
占位符,而不是%d
.
ptr 存储整数对象的起始字节的地址。这是存储最高有效字节还是最低有效字节的位置取决于您的平台。一些奇怪的平台甚至使用混合字节序,在这种情况下它既不是 MSB 也不是 LSB。
在这方面,C 和 C++ 没有区别。
它指出的是我的 VC++ 2010 和 Digital Mars 的 MSB。但它与字节序有关。
这个问题的答案为您提供了一些信息: Detecting endianness programmatically in a C++ program。
在这里,用户“none”说:
#define BIG_ENDIAN 0
#define LITTLE_ENDIAN 1
int TestByteOrder()
{
short int word = 0x0001;
char *byte = (char *) &word;
return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN);
}
这提供了一些字节顺序信息
那么我得到i的LSB地址还是MSB?
这取决于机器和操作系统。在大端机器和操作系统上,您将获得 MSB,在小端机器和操作系统上,您将获得 LSB。
Windows 总是小端。x86 上的所有(大多数?)Linux/Unix 风格都是小端。摩托罗拉机器上的 Linux/Unix 是大端。x86 机器上的 Mac OS 是小端。在 PowerPC 机器上它是大端。
那么它在平台之间的行为不同吗?是的,它会。
c和c ++之间有区别吗?可能不是。