将int转换为字节数组时的C++字节顺序

将int转换为字节数组时的C++字节顺序,c++,casting,endianness,C++,Casting,Endianness,考虑到我的平台是little endian,我假设当表示为字节数组时,四字节整数值1将表示为0x00、0x00、0x00、0x01。既然如此,有人能解释一下为什么下面的断言失败了 int val{1}; auto bytes = reinterpret_cast<char*>(&val); assert(bytes[sizeof(int) - 1] == 0x01); 在转换为char*之后,字节看起来是颠倒的。我对endianness的假设是错误的吗?是编译器的叮当声还是

考虑到我的平台是little endian,我假设当表示为字节数组时,四字节整数值1将表示为0x00、0x00、0x00、0x01。既然如此,有人能解释一下为什么下面的断言失败了

int val{1};
auto bytes = reinterpret_cast<char*>(&val);
assert(bytes[sizeof(int) - 1] == 0x01);

在转换为char*之后,字节看起来是颠倒的。我对endianness的假设是错误的吗?是编译器的叮当声还是语言在抽象endianness?发生了什么事?

小尾端的意思是最低有效位在第一位,所以在内存中,1的值为0x00000001。注意这里的第一个意思是在右边,因为那是截断发生的地方。如果将该32位整数强制转换为8位整数,则将得到最右边的部分,即0x01。

小尾端先表示最低有效位,因此在内存中,1的值为0x00000001。注意这里的第一个意思是在右边,因为那是截断发生的地方。如果将该32位整数转换为8位整数,将得到最右边的部分ie 0x01。

您的假设是相反的。在little endian中,32位整数值1以十六进制表示为0x00000001,但以字节表示为0x01 0x00 0x00 0x00。

您的假设是相反的。在little endian中,32位整数值1以十六进制表示为0x00000001,但以字节表示为0x01 0x00 0x00 0x00。

您说过

考虑到我的平台是little endian,我假设当表示为字节数组时,四字节整数值1将表示为0x00、0x00、0x00、0x01

错误的假设。这就是大端系统。看

你说

考虑到我的平台是little endian,我假设当表示为字节数组时,四字节整数值1将表示为0x00、0x00、0x00、0x01

错误的假设。这就是大端系统。看


Little endian表示首先写入或存储数字的最低有效位。Big-endian表示首先写入或存储最重要的数字

想想我们通常在纸上写数字的方式。在纸上写基数为10的数字4823时,我们把它写成大端。第一个数字4是千位数。我们称它为最重要的数字,因为它对数字的大小影响最大。第二个数字8是百位数。第三个数字2是十位数。第四位也是最后一位数字3是一位或单位数字。我们称1为最不重要的数字,因为它对数字大小的影响最小

四字节32位整数作为基数256存储在内存中。每个字节是一个数字,但数字的范围是从0到255,而不仅仅是从0到9

一个小的endian平台首先存储最低有效字节,即一位数。256s数字是第二个字节。65536s数字是第三个字节。16777216的数字是第四位也是最后一位

因此,在您的示例中,我们可以将数字写入纸张0x00000001,因为我们几乎总是将数字写入纸张大端,但在小端系统中,以256位为基数的字节以01 00的顺序存储


请注意,我们无法在大多数系统上直接处理单个位。因此,在机器代码级别上,无法判断字节中的各个位是存储在低位还是高位,或者这在硬件级别上是否是一个有意义的概念。这就是为什么我说数字是以256为基数存储的,而不是以2为基数存储的。

小尾端的意思是首先写入或存储数字的最低有效位。Big-endian表示首先写入或存储最重要的数字

想想我们通常在纸上写数字的方式。在纸上写基数为10的数字4823时,我们把它写成大端。第一个数字4是千位数。我们称它为最重要的数字,因为它对数字的大小影响最大。第二个数字8是百位数。第三个数字2是十位数。第四位也是最后一位数字3是一位或单位数字。我们称1为最不重要的数字,因为它对数字大小的影响最小

四字节32位整数作为基数256存储在内存中。每个字节是一个数字,但数字的范围是从0到255,而不仅仅是从0到9

一个小的endian平台首先存储最低有效字节,即一位数。256s数字是第二个字节。65536s数字是第三个字节。16777216的数字是第四位也是最后一位

因此,在您的示例中,我们可以将数字写入纸张0x00000001,因为我们几乎总是将数字写入纸张大端,但在小端系统中,以256位为基数的字节以01 00的顺序存储

请注意,我们无法在大多数系统上直接处理单个位。因此,在机器代码级别,无法判断个人
字节中的位存储在小端或大端,或者这在硬件级别上是否是一个有意义的概念。这就是为什么我说数字是以256为基数存储的,而不是以2为基数。

小尾端-第一个字节是最小的-即1小尾端表示小尾端优先,小尾端=最低有效,内存中的第一个小尾端-第一个字节是最小的-即1小尾端表示小尾端优先,小尾端=最低有效,首先,在内存中,从基地址开始的逐字节图片可能会更清晰。在内存中,你将有01 00 00用于小端,00 00 00 01用于大端。我不知道截断和OP的代码有什么关系,而且无论如何都是不正确的。从32位int到8位int的转换将通过值表示完成;不是内存布局。无论您是在big-endian还是little-endian机器上,static_castint1都会生成一个值为0x01的字符。从基地址开始的逐字节图片可能更清晰。在内存中,你将有01 00 00用于小端,00 00 00 01用于大端。我不知道截断和OP的代码有什么关系,而且无论如何都是不正确的。从32位int到8位int的转换将通过值表示完成;不是内存布局。无论您是在big-endian还是little-endian机器上,static_castint1都会生成一个值为0x01的字符。
assert(bytes[0] == 0x01);