是否指定了具有不同Endianness实现的位字段?

伊夫

众所周知,我们有两种字节序:大字节序和小字节序。

假设整数占用4个字节,因此对于小端字节,整数布局1应为0x01 0x00 0x00 0x00,对于大端字节0x00 0x00 0x00 0x01。

要检查机器是小端还是大端,我们可以编写以下代码:

int main()
{
    int a = 1;
    char *p = (char *)&a;
    // *p == 1 means little endian, otherwise, big endian

    return 0;
}

据我了解,*p第一个八位位组被分配:0x01对于小端和0x00大端(上面两个粗体部分),代码就是这样工作的。

现在,我不太了解位域在不同字节序下的工作方式。

假设我们有这样一个结构:

typedef struct {
    unsigned char a1 : 1;
    unsigned char a2 : 1;
    unsigned char a6 : 3;
}Bbit;

然后我们进行如下分配:

Bbit bit;
bit.a1 = 1;
bit.a2 = 1;

这段代码会特定于实现吗?我在问bit.a1and的值bit.a2是否1在小端上,0在大端上?还是绝对不1考虑它们的字节序?

佳美

假设我们有一个结构:

typedef struct {
    unsigned char a1 : 1;
    unsigned char a2 : 1;
    unsigned char a6 : 3;
}Bbit;

和一个定义:

Bbit byte;

假设byte存储在单个字节中,并且当前被清零:0000 0000

byte.a1 = 1;

这会将称为的位设置a11如果a1是第一位,则byte变为1000 0000,如果a1是第五位,则byte变为0000 1000,如果a1是第八位,则byte变为0000 0001

byte.a2 = 1;

这会将称为的位设置a21如果a2是第二位,则byte(可能)变为1100 0000,但如果a2是第六位,则byte(可能)变为0000 1100,如果a2是第七位,则byte变为0000 0011(这些只是“可能的”,因为不能保证这些位遵循某种合理的顺序。编译器不太可能搞乱这个示例。)

对于存储的值,字节序不是一个因素。每次分配仅更改代表指定位字段的位,并且将分配的值减少到该位数(如果实现值对于该位数而言太大,则使用实现定义的行为)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何查找所有具有在intelliJ中实现指定接口的类的字段?

检查具有相同ID的DB中的记录在字段中是否具有不同的值

具有位字段的C ++结构大小

找出对象列表是否包含具有指定字段值的内容?

Python是否具有位域类型?

不同的功能是否具有不同的地址?

如何实现具有不同片段的ViewPager?

实现接口,但具有不同的属性名称

具有不同实现方式的循环DHT

删除字段具有指定值的记录

当模型具有相同的字段但不同的 help_text 时,django 中是否可以继承

搜索具有不同字段的多个索引

Laravel:具有不同字段的独特验证

具有不同字段数的条目

具有不同字段值的分组查询

删除具有不同数据的重复字段

检测JSON文件是否具有字段

对于具有未实现默认值的字段的结构,是否有一种简短的方法来实现默认值?

连接具有不同字段数的行中的字段

合并具有不同字段和未知字段的数据框

PHP-'if(!$ _ POST)'是否足以(无需指定字段名称)来检测数据是否通过具有1个字段的表单传递?

是否可以创建其字段是具有通用参数的函数的记录类型,而在创建记录时不指定类型?

mongo查找所有具有指定键的对象的字段

指定实现的同时具有接口类的WebAPI模型[ModelBinder]

是否可以将application.yml的属性解析为具有不同名称的java类字段?

是否可以通过正则表达式提取具有两个不同名称的相同字段?

在VHDL中如何实现具有n位输入,1位输出的异或门

具有乘法和钳位的 8 位无符号定点实现

是否可以在scala中具有不同名称和略有不同的字段的两个案例类之间进行转换