相关疑难解决方法(0)

C/C++:强制位域顺序和对齐

我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:

struct Message
{
  unsigned int version : 3;
  unsigned int type : 1;
  unsigned int id : 5;
  unsigned int data : 6;
} __attribute__ ((__packed__));
Run Code Online (Sandbox Code Playgroud)

在具有GCC编译器的英特尔处理器上,字段在显示时显示在内存中.Message.version是缓冲区中的前3位,然后Message.type是.如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?

c c++ bit-manipulation endianness bit

81
推荐指数
5
解决办法
7万
查看次数

为什么在C++中没有像签名那样的字节顺序修饰符?

(我想这个问题可能适用于许多类型语言,但我选择使用C++作为例子.)

为什么没有办法写:

struct foo {
    little int x;   // little-endian
    big long int y; // big-endian
    short z;        // native endianness
};
Run Code Online (Sandbox Code Playgroud)

指定特定成员,变量和参数的字节顺序?

与签名比较

我知道变量的类型不仅决定了用于存储值的字节数,还决定了在执行计算时如何解释这些字节.

例如,这两个声明每个都分配一个字节,对于两个字节,每个可能的8位序列都是有效值:

signed char s;
unsigned char u;
Run Code Online (Sandbox Code Playgroud)

但是相同的二进制序列可能会有不同的解释,例如11111111,在分配时指的是-1,而指定时指的是s255 u.当有符号和无符号变量涉及相同的计算时,编译器(主要)负责正确的转换.

在我的理解中,字节序只是同一原则的变体:基于关于存储它的存储器的编译时信息对二进制模式的不同解释.

在允许低级编程的类型语言中使用该功能似乎是显而易见的.但是,这不是C,C++或我所知的任何其他语言的一部分,我没有在网上找到任何关于此的讨论.

更新

我会试着总结一下我在询问后的第一个小时内收到的许多评论中的一些内容:

  1. signness是严格二进制的(无论是有符号还是无符号),并且总是与endianness相反,endianness也有两个众所周知的变体(大和小),但也有较少知名的变体,如mixed/middle endian.未来可能会发明新的变种.
  2. 字节顺序访问多字节值时,字节顺序很重要.除了字节序之外还有很多方面会影响多字节结构的内存布局,所以这种访问通常是不受欢迎的.
  3. C++旨在针对抽象机器并最小化有关实现的假设数量.这个抽象机器没有任何字节序.

此外,现在我意识到签名和字节序不是一个完美的类比,因为:

  • endianness仅定义某些事物如何表示为二进制序列,但现在可以表示什么.双方big intlittle int会具有完全相同的数值范围.
  • 有符号性定义比特和实际值如何相互映射,但也影响可以表示的内容,例如-3不能用a表示unsigned char(假设char有8位)130不能用a表示signed …

c++ language-features static-typing endianness

58
推荐指数
2
解决办法
6113
查看次数