![]() |
1
2
正如其他人所说,必须在
其他语言具有整数范围类型,例如,您可以指定变量范围为17到42。在C中没有太多这样的调用,因为C从不需要对溢出进行实现检查。所以C程序员只需选择一个能够表示所需范围的类型;无论如何检查边界都是他们的工作。
C89(即您可以在任何地方找到的C语言版本)提供了有限的类型选择
至少N位
. 有
|
![]() |
2
6
第一个示例不起作用,因为您只能在结构中声明位域。正如您所说,这是语法,而不是语义,但它确实存在。如果需要位域,请使用结构。 |
![]() |
3
3
你为什么要做这种事?位字段12在所有常见的架构中都被填充到至少16或32位。
如果要确保整数变量的宽度,请使用中的类型
|
![]() |
4
1
位域提供了一致的语法来访问某些依赖于实现的功能。该功能最常见的目的是以某种方式将某些数据项放入位中, 相对 . 如果两个项(位字段与否)声明为结构中的连续项,则保证它们是连续存储的。无论存储类或范围如何,单个变量都不存在这样的保证。如果结构包含: struct foo { unsigned bar: 1; unsigned boz: 1; }; 可以保证BAR和BOZ将连续存储(很可能是在同一个存储位置,不过我认为这并不能保证)。相比之下,“bar”和“boz”是单位自动变量,无法知道它们将存储在何处,因此将它们作为位字段没有什么好处。如果它们确实与其他变量共享空间,则很难确保在同一字节中读取和写入不同位的不同函数不会相互干扰。 请注意,一些嵌入式系统编译器确实公开了一个真正的“位”类型,它被打包为8到1个字节。这样的编译器通常有一个内存区域,它被分配用来存储位变量,而为其生成代码的处理器具有测试、设置和清除单个位的原子指令。由于存储位的存储器位置只能使用这样的指令访问,因此不存在冲突的危险。 |
![]() |
Mehmet Aslan · freertos堆栈不会溢出 7 月前 |
![]() |
rdre8 · x86指令,堆栈指针解释 1 年前 |
|
melonfsck · 是否允许在堆栈上分配旋转锁? 1 年前 |
|
Yashas Nadig · 调用堆栈lifo队列是否正确? 1 年前 |
![]() |
Sougata Mukherjee · 使用js中的stack反转句子 1 年前 |
|
Nurana · c堆栈(使用动态数组)realloc内存泄漏问题 1 年前 |