#include <stdio.h>int main(){ int a; typedef struct { int b7 : 1; int b6 : 1; int b5 : 1; int b4 : 1; int b3 : 1; int b2 : 1; int b1 : 1; int b0 : 1; } byte; byte ab0 = {0,1}; a = *(int*)&ab0; printf("ab0 is %x \n",a); byte ab1 = {0,1,0}; a = *(int*)&ab1; printf("ab1 is %x \n",a); byte ab2 = {0,0}; a = *(int*)&ab2; printf("ab2 is %x \n",a); byte ab3 = {0,0}; a = *(int*)&ab3; printf("ab3 is %x \n",a); byte ab4 = {0,0}; a = *(int*)&ab4; printf("ab4 is %x \n",a); byte ab5 = {0,0}; a = *(int*)&ab5; printf("ab5 is %x \n",a); byte ab6 = {0,0}; a = *(int*)&ab6; printf("ab6 is %x \n",a); byte ab7 = {1,0}; a = *(int*)&ab7; printf("ab7 is %x \n",a); return 0;}
编译并运行
gcc -Wall test.c./a.out ab0 is 80 ab1 is 40 ab2 is 20 ab3 is 10 ab4 is 8 ab5 is 4 ab6 is 2 ab7 is 1
我在线运行代码时输出相同
http://codepad.org/ntqyuixp
我无法理解它的输出.
预期产出:
根据我的理解输出应该是
ab0 is 1 ab1 is 2 ab2 is 4 ab3 is 8 ab4 is 10 ab5 is 20 ab6 is 40 ab7 is 80
>请让我知道我错过了什么.
> endianness是否扮演任何角色?
>如何为我预期的行为编写代码?
关于位字段的几乎所有内容都是实现定义的.
ISO / IEC 9899:2011§6.7.2.1结构和联合说明符
¶4 The Expression that specifIEs the wIDth of a bit-fIEld shall be an integer constant
Expression with a nonnegative value that does not exceed the wIDth of an object of the
type that would be specifIEd were the colon and Expression omitted.122) If the value is
zero,the declaration shall have no declarator.¶5 A bit-fIEld shall have a type that is a qualifIEd or unqualifIEd version of
_Bool
,signed
,
intunsigned int
,or some other implementation-defined type. It is
implementation-defined whether atomic types are permitted.…
¶9 A member of a structure or union may have any complete object type other than a
variably modifIEd type.123) In addition,a member may be declared to consist of a
specifIEd number of bits (including a sign bit,if any). Such a member is called a
bit-fIEld;124) its wIDth is preceded by a colon.¶10 A bit-fIEld is interpreted as having a signed or unsigned integer type consisting of the
specifIEd number of bits.125) If the value 0 or 1 is stored into a nonzero-wIDth bit-fIEld of
type_Bool
,the value of the bit-fIEld shall compare equal to the value stored; a_Bool
bit-fIEld has the semantics of a_Bool
.¶11 An implementation may allocate any addressable storage unit large enough to hold a bitfIEld. If enough space remains,a bit-fIEld that immediately follows another bit-fIEld in a structure shall be packed into adjacent bits of the same unit. If insufficIEnt space remains,whether a bit-fIEld that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fIElds within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecifIEd.
¶12 A bit-fIEld declaration with no declarator,but only a colon and a wIDth,indicates an
unnamed bit-fIEld.126) As a special case,a bit-fIEld structure member with a wIDth of 0 indicates that no further bit-fIEld is to be packed into the unit in which the prevIoUs bitfIEld,if any,was placed.122) While the number of bits in a
_Bool
object is at leastCHAR_BIT
,the wIDth (number of sign and value bits) of a_Bool
may be just 1 bit.123) A structure or union cannot contain a member with a variably modifIEd type because member names are not ordinary IDentifIErs as defined in 6.2.3.
124) The unary
&
(address-of) operator cannot be applIEd to a bit-fIEld object; thus,there are no pointers to or arrays of bit-fIEld objects.125) As specifIEd in 6.7.2 above,if the actual type specifIEr used is
int
or a typedef-name defined asint
,then it is implementation-defined whether the bit-fIEld is signed or unsigned.126) An unnamed bit-fIEld structure member is useful for padding to conform to externally imposed layouts.
特别注意¶11:
The order of allocation of bit-fIElds within a unit (high-order to low-order or low-order to high-order) is implementation-defined.
另请注意,“实现定义”意味着实现必须定义它的功能.也就是说,您可以检查文档,文档必须告诉您编译器的作用(如果编译器符合标准).这与“未指定”以及您将遇到的其他一些术语不同 – 编译器编写器几乎肯定不会随意更改位字段从发布到发布的行为.相反,例如,评估函数参数的方式可能会在发布之间发生变化,或者根据编译时选择的优化选项等进行更改.
总结§6.5.2.2 Function calls
There is a sequence point after the evaluations of the function designator and the actual arguments but before the actual call. Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function.94)
94) In other words,function executions do not ‘‘interleave’’ with each other.
6.7.2 Type specifIErs
5 Each of the comma-separated multisets designates the same type,except that for bit-fIElds,it is implementation-defined whether the specifIEr
int
designates the same type assigned int
or the same type asunsigned int
.
以上是内存溢出为你收集整理的C中的位域内存管理全部内容,希望文章能够帮你解决C中的位域内存管理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)