c-在一台小型endian机器上,位运算符将如何工作



我有以下代码,它从文件中获取像素值。我在运行OS X的英特尔macbook上。我相信这是小端序。我有下面的代码,我正在使用它来确定是否在像素上设置了最低有效位。它编译并运行,但我不确定by操作是否真的给了我正确的数据。

 typedef struct {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
 } pixel_t;
 pixel_t *pixels = malloc(((bmp->dib.bmp_bytesz/3)+1) * sizeof(*pixels));
 printf("%u", (pixels[i].red & 0x01));
 printf("%u", (pixels[i].green & 0x01));
 printf("%u", (pixels[i].blue & 0x01));

小端和大端是指以较大单位(如shortint)表示的字节(而不是位本身)的顺序。

按位操作是相同的;操作会在pixels[i].blue等中为您提供数字的最低有效位。如果它们存储在char(或unsigned charsigned char)中,则没有问题。如果它们存储在intshort或其他文件中,则根据机器是大端序还是小端序,被寻址的字节将有所不同,但它仍然是平台上数字的最低有效位。

Endianess是影响值存储方式的内部细节。它对值的计算方式没有影响

Jonathan已经有了正确的答案。。。只是添加了一个示例。

Endianness描述了多字节数据是如何存储在计算机内存中的。它描述了地址的最高有效字节(MSB)和最低有效字节(LSB)在内存中的位置。Big Endian:首先存储MSB,即从左到右Little Endian:先存储LSB,即从右到左。

示例:0x04030201是如何存储在内存中的?

Address     BE  LE
00000000    04  01
00000001    03  02
00000002    02  03
00000003    01  04

最新更新