首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言中位域(bit fields)的可移植问题

网上有文章说C语言的“位域”(bit fields)有可移植性的问题,原因是不同的编译器对位域的实现不同。   我决定用实验验证一下。  一、 实验过程:   1....准备实验程序   这 是谭浩强C语言课本上第12章12.2节的位域示例程序: main() {   struct bs   {   unsigned a:1;   unsigned b:3;   unsigned...位SPARC系统上,位域对应的二进制位为:   abbbcccc dddddddd eeeeeeee eeeeeeee ffffffff ffffffff ffffffff ffffffff   因为...  在64位x86系统上,位域对应的二进制位为:   ffffffff ffffffff ffffffff ffffffff eeeeeeee eeeeeeee dddddddd ccccbbba...并且,把整个bitfields作为unsigned long输出时,输出了整个bitfields的全部内容。   三、 实验结论:   1. 机器的字长和字节序,会直接影响到“位域”的值。

98310

c语言位域

位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:  struct  位域结构名 {  位域列表  }; 其中位域列表的形式为: 类型说明符 位域名:位域长度 。 ...例如:  struct bs { int a:8; int b:2; int c:6; }; 位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。...例如:  struct bs { int a:8; int b:2; int c:6; }data; 说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。...,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。...同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。

1.9K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言笔记】位域

    正是基于这种考虑,C语言又提供了一种数据结构,叫做位域或位段。 位域是操控位的一种方法(操控位的另一种方法是使用按位运算符,按位运算符将在之后的笔记中做介绍)。...位域通过一个结构声明来建立:该结构声明为每个字段提供标签,并确定该字段的宽度。...而结构体变量pk2的各成员超出了限定的位数,并发生了上溢(溢出中的一种),关于溢出的概念可查看往期笔记:【C语言笔记】整数溢出 C语言标准规定,只有有限的几种数据类型可以用于位域。...位域的存储 位域的存储同样遵循结构体内存对齐的规则,关于结构体内存对齐的问题可查看往期笔记:【C语言笔记】C语言结构体内存对齐问题 看一个例子: #include struct pack...位域也是个很重要的知识点,如在DSP2803X的固件库的一些结构封装中普遍用到这样的写法: ? 以上就是关于位域的一些笔记,如有错误,欢迎指出!

    1.9K30

    c语言中位运算符的用法_c语言中位运算符的优先级

    C语言提供了六种位运算 位运算符 含义 举例 &(and) 按位与 a&b | ( or ) 按位或 a|b ^ ( xor ) 按位异或 a^b ~ ( not ) 按位取反 ~a 位屏蔽掉(保留一个数据中的某些位)。 如果要使整数k的低四位置零,保留其它位。...“按位异或”运算符^ 运算规则:参加运算的两个运算量,如果两个数的相应位的值不同,则该位的结果值为1,否则为0。...【例】a的各位依次向左移2位,a的最高2位移出去舍弃,空出的低2位以0填补。...如将一个无符号整数x的各位进行循环左移4位的运算,即把移出的高位填补在空出的低位处。 可以用以下步骤实现: (1)将x左移4位,空出的低4位补0,可通过表达式x<<4实现。

    81510

    聊一聊C语言位域位段

    位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: type [member_name] : width ; 下面是有关位域中变量元素的描述...: 位域的使用和结构体成员的使用相同,其一般形式为: 位域变量名.位域名 位域变量名->位域名 位域最大的作用就是节省存储空间,在本质上就是一种结构类型,不过其成员是按二进位分配的。...4 } 在这个位域定义中,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开始,占用 4 位,c 占用 4 位。...无名的位域是不能使用的。...注意:位域成员往往不占用完整的字节,有时候也不处于字节的开头位置,因此使用&获取位域成员的地址是没有意义的,C语言也禁止这样做。地址是字节(Byte)的编号,而不是位(bit)的编号。

    80820

    纠缠不清的C语言位域(位段)详解

    正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。 在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。...超出部分被直接截去,剩下 1101、11 1010,换算成十六进制为 0xd、0x3a(0x3a 对应的字符是 :)。 C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。...我们可以这样认为,位域技术就是在成员变量所占用的内存中选出一部分位宽来存储数据。 C语言标准还规定,只有有限的几种数据类型可以用于位域。...位域的存储 C语言标准并没有规定位域的具体存储方式,不同的编译器有不同的实现,但它们都尽量压缩存储空间。...通过上面的分析,我们发现位域成员往往不占用完整的字节,有时候也不处于字节的开头位置,因此使用&获取位域成员的地址是没有意义的,C语言也禁止这样做。

    3K40

    c语言中位运算符_位运算符的用法

    大家好,又见面了,我是你们的朋友全栈君。 C语言的运算符是一个很有意思的东西,运用起来可以解决很多麻烦的事,但是想要灵活应用也有一定的难度,总结一下c语言运算符的用法和一些常用技巧....一.C语言位运算符简介 C语言的位运算符有六种,分别是: >> 右移运算符 << 左移运算符 & 按位与运算符 | 按位或运算符 ^ 按位异或运算符 ~ 按位取反运算符...:在位移的过程中,符号位左边可能移入新的位,移入的新位由符号位决定,符号位为 1则移入的新位用1补充,符号位为0则用0补充,保持原数的正负不变,这样的移位 方式称为算术移位....a = -1; int b = 2; int c = 4; printf("%d\n",b & c ); printf("%d\n", b | c ); printf("%d\n",a & b );...vis[ x / 32 ] & ( 1 << x % 32 ) ) printf("YES\n"); else printf("NO\n"); } return 0 ; } 使用了c语言的位运算符

    88560

    从Ndom语浅谈语言中的进制

    其计数系统非常有意思,比如6进制而只有18、36为独立的词汇,而其他的诸如12等使用乘来表示。而有趣的计数系统觉得不止Ndom语言一种,事实上在使用范围广的语言中也或多或少有这样的现象。...接着很简单的就能推理得到:fete=6^2=36,tarumba=6^3=216。接下来换着看,看纳瓦特尔语。在(1)可以看到,mahtlactli乘上cë不变,所以cë应该是1。...1的意思,可以发现和cë十分像,估计是cë的变形。...(13)中,纳瓦特尔语部分的高位是yë-tzontli,而阿兰姆巴语的ndamno应该是6的n次方(≥4)。因为6的5次方已经是7776了,所以很明显ndamno是6^4=1296。...根据规则,纳瓦特尔语的494就是1*20^2+4*20+10+4即cen-tzontli-on-näuh-pöhualli-om-mahtlactli-on-nähui;阿兰姆巴语的569应该是2*6^

    11.1K20

    C语言位域(位段)详解与实例分析

    位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: type [member_name] : width; 下面是有关位域中变量元素的描述...: 位域的使用和结构体成员的使用相同,其一般形式为: 位域变量名.位域名 位域变量名->位域名 位域最大的作用就是节省存储空间,在本质上就是一种结构类型,不过其成员是按二进位分配的。...4 } 在这个位域定义中,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开始,占用 4 位,c 占用 4 位。...无名的位域是不能使用的。...注意:位域成员往往不占用完整的字节,有时候也不处于字节的开头位置,因此使用&获取位域成员的地址是没有意义的,C语言也禁止这样做。地址是字节(Byte)的编号,而不是位(bit)的编号。

    72620

    【编程基础】如何了解c语言中的位运算?

    计算机的各种运算最小单位是字节,但是有时候只对某个位(bit)感兴趣,C语言提供了一些列位运算符来完成这个任务。...这些操作非常重要,尤其是在嵌入式开发中会常常用到,这也是为什么嵌入式基本上都是选用C语言来开发的重要原因之一。...C语言的位运算有一下六中: & 按位与 | 按位或 ^ 按位亦或 ~ 按位取反 << 左移 >> 右移 按位与& 两个对应的位为1,运算后对应位为1,否则为0...以上基本的位运算其实很简单,很多人一看就理解了,但是要灵活应用却不是那么简单的。比如有群友提出清除位是怎么回事,其实就是这个为位运算了,将一个数的某一个位设置为0。...,位运算本身是很简单的,但是真正应用起来是非常复杂的。

    1.8K50

    C语言:--位域和内存对齐

    这节写点什么,就写位域和内存对齐吧。 位域 位域是指信息在保存时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位。为了节省空间,C语言提供了一种数据结构,叫“位域”或“位段”。...位域的使用和结构成员的使用相同,其一般形式为:位域 变量名.位域名 位域允许用各种格式输出。 1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性)。...(整个struct的大小为4,因为位域本质上是从一个数据类型分出来的,在我们的例子中数据类型就是unsigned,大小为4,并且位域也是满足C 的结构体内存对齐原则的,等下我们会说到)。...在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。...其四,位域的位置不能访问,因些不能对位域使用地址运算符号&(而对非位域成员则可以使用该运算符).从而,即不能使用指向位域的旨针也不能使用位域的数组(因为数组实际上就是一种特殊的指针).另外,位域也不能作为函数返回的结果

    3K30

    c语言中按位异或运算_c语言按位与怎么算

    按位“与”运算符 (&) 会将第一操作数的每一位与第二操作数的相应位进行比较。如果两个位均为 1,则对应的结果位将设置为 1。否则,将对应的结果位设置为 0。...按位与或运算符:| 语法 expression | expression 备注 按位“与或”运算符 (|) 将第一个操作数的每个位与第二个操作数的对应位进行比较。...如果其中一个位是 1,则将对应的结果位设置为 1。否则,将对应的结果位设置为 0。 按位“与或”运算符的两个操作数必须为整型。 算术转换中涵盖的常用算术转换适用于操作数。...按位异或运算符:^ 语法 expression ^ expression 备注 按位“异或”运算符 (^) 将第一操作数的每个位与第二操作数的相应位进行比较。...如果一个位是 0,另一个位是 1,则相应的结果位将设置为 1。否则,将对应的结果位设置为 0。 按位“异或”运算符的两个操作数都必须为整型。 算术转换中涵盖的常用算术转换适用于操作数。

    2.8K40

    c语言位运算符的用法_c语言中位运算符及其含义

    大家好,又见面了,我是你们的朋友全栈君。 1;位运算; 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。...(均以二进制的补码形式) 整数;及只能是带符号或者无符号的char,short,int,long类型; 2;c语言中的6种位运算符; & 按位与——如果两个相应的二进制位都为1,则该位的结果值为...1,否则为0; | 按位或——两个相应的二进制位中只要有一个为1,该位的结果值为1; ^ 按位异或—— 若参加运算的两个二进制位值相同则为0,否则为1; ~ 取反 ——~是一元运算符,用来对一个二进制数按位取反...,即将0变1,将1变0; 的各二进制位全部左移N位,右补0; ;>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0; 3;运算符的应用...3.4;按位取反~;他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。

    1.1K10

    C语言中位运算异或“∧”的作用「建议收藏」

    它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。即 0∧0=0,0∧1=1, 1^0=1,1∧1=0。...可以将它与00001111进行∧运算,即 结果值的低4位正好是原数低4位的翻转。要使哪几位翻转就将与其∧运算的该几位置为1即可。...这是因为原数中值为1的位与1进行∧运算得0,原数中的位值0与1进行∧运算的结果得1。 (2)实现两个值的交换 通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。...,a); b=b^a; printf("second value %d\n",b); a=a^b; printf("third value %d\n",a); } 参考: 1.C语言中位运算符异或...“∧”的作用 2.C语言异或运算 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140571.html原文链接:https://javaforall.cn

    3.7K20

    教你快速了解C语言中的作用域和常量

    章节目录 前言 一、变量作用域和生命周期 作用域 局部变量的作用域 全局变量的作用域 生命周期 局部变量的生命周期 全局变量的生命周期 二、常量 C语言中的常量分为以下以下几种: 1.1 字面常量 1.2...枚举类型的值怎么修改? 总结 前言   哈喽,各位铁汁们好啊!✨今天来给大家带来的是初识C语言里面的作用域、常量。   这几章主要带大家简单认识-一下C语言,俗话说没吃过猪肉,也见过猪跑。...带大家了解下C语言。可以读懂C语言的简单程序,后期会给大家详细介绍C语言。...全局变量的作用域 前面介绍了全局变量的的生效范围是全局, 在不同.c文件也可以使用。 有因为我们程序是main()函数开始 出main函数结束 所以: 全局变量的作用域是整个工程。...二、常量 C语言中的常量分为以下以下几种: 字面常量 const 修饰的常变量 #define 定义的标识符常量 枚举常量 1.1 字面常量 像我们直接写出来的 数字3 字符a 字符串abcd这些都是字面常量

    23110

    C- unsigned :1之位域分析

    做低层时,经常会读写寄存器,比如操作某位,设置为0或1,而在C语言中便为我们提供一种数据结构”位域”,使得我们通过读写”位域”来实现操作某位....3.位域之越界处理 比如,我们定义的某个位域只有固定1位,如果向该位写入超过1位的值.会自动保留最低1位....4.注意, 使用位域的结构体的长度默认最小值为int型(4字节),如果超过4字节(32位),则会是64位 示例: #include struct { unsigned...a:4; unsigned b:2; unsigned c:1; }reg1;        //位域总长度只有7位 struct reg{ unsigned...5.如果某个寄存器只有8位(1字节),该如何使用位域处理? 使用union联合体,使各字段共享一块内存,通过读写union结构体里的char变量即可.

    1K40

    c语言中按位异或的作用,C语言 按位异或实现加法(示例代码)

    /*C语言 按位异或实现加法*/#include#include#include voidtest1() {int a = 2;int b = 3;int cand = 0;int cxor = 0;int...c = 0;//实现c=a+b//1.不考虑进位,按位计算各位累加(用异或实现),得到值xor; cxor = a^b;/*实现说明: a的值是2,对应计算机中补码是 0000 0000 0000 0000...,结果左移1位 cand = a&b;/*实现说明: a的值是2,对应计算机中补码是 0000 0000 0000 0000 0000 0000 0000 0010 b的值是3,对应计算机中补码是 0000...;//实现c=a+b//1.不考虑进位,按位计算各位累加(用异或实现),得到值xor; cxor = a^b;/*实现说明: a的值是2,对应计算机中补码是 1 111 1111 1111 1111 1111...,结果左移1位 cand = a&b;/*实现说明: a的值是2,对应计算机中补码是 1 111 1111 1111 1111 1111 1111 1111 1110 b的值是3,对应计算机中补码是 0

    1.2K10

    【编程基础】c语言中获取整数和浮点数的符号位

    为什么要获得符号位 很多时候,我们需要判断数值的正负,来做相应的逻辑处理。条件判断语句可以很好的完成这个需求。...,或是计算结果的符号位变化。...而数值的符号位已经被存储在了数值的最高位,可以利用这点来避免条件判断。 2. 如何得到符号位 可能有很多种方法。但是通过移位来获得符号位是最直接想到的。...((signed char*) &x)[sizeof(x) - 1] 我们假定小端存储模式,那么符号位就在char数组的最后一个空间。我们拿到了有符号位的char数据并且当做有符号数来处理。...: x = (x - 1) * MathUtils_SignBit(x)x *= MathUtils_SignBit(x) 转自(http://www.th7.cn/Program/c/201503

    2.2K80
    领券