C语言 段位

  C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”

  在结构体中位段的定义格式为:

unsignede <成员名>:<二进制位数>;

例如:

struct bytedata{
    unsigned a:2;   /*位段a,占2位*/
     unsigned b:6;   /*位段b,占6位*/
}data;

 引用结构体的位段成员同引用结构体其他类型成员一样,但应注意位段的最大取值范围不要超出二进制位数限制的范围,否则超出部分会丢失。

例如:

data.a = 2;  /*正确*/

data.b = 10;/*错误,超出范围(a占2位,能容纳的最大值为3)*/

  关于位段,还需要注意以下几点:

(1)位段成员的数据类型必须是unsigned.

(2)可以定义长度为0的位段。这使下一位段从下一存储单元(一个存储单元一般是两个字节)开始。例如:

struct bytedata{
    unsigned a:1;
    unsigned b:2;
    unsigned:0;
    unsigned c:3;
};

本来a、b、c应连续存放在一个存储单元中,但由于用长度0的位段将b、c隔开,现只能将a、b存放在一个存储单元中,而c另存放在下一个单元中

(3)位段不能跨单元存储,如果上一单元的剩余空间不够存储新的位段,则跳过此剩余空间,将该位段存放在下一个单元中

(4)可以定义无名位段,但其空间不能使用。

struct bytedata{
    unsigned a:1;
    unsigned:2;    /*无名位段,占2位,不能使用*/
    unsigned c:3;
};

(5)一个位段的长度不能大于一个存储单元的长度。

(6)不能定义位段数组。

(7)位段可以以%d、%u、%o、%x等格式输出。

(8)位段若出现在表达式中,将被系统自动转换成整型数。

位段排序:

先定义先排序

时间: 2024-10-10 02:46:09

C语言 段位的相关文章

用 C 语言编写一个简单的垃圾回收器

人们似乎认为编写垃圾回收机制是很难的,是一种只有少数智者和Hans Boehm(et al)才能理解的高深魔法.我认为编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc样例难度是相当的. 在开始之前有一些重要的事情需要说明一下:第一,我们所写的代码是基于Linux Kernel的,注意是Linux Kernel而不是GNU/Linux.第二,我们的代码是32bit的.第三,请不要直接使用这些代码.我并不保证这些代码完全正确,可能其中有一些我 还未发现的小的bug,但是整体思路仍

Python程序员段位自测:奋斗许久,你是青铜还是王者?

Python的使用场景实在太丰富,从入门编写各种小程序,到爬虫.到全栈.到自动化.到大数据.到AI,各式各样的场景中都能看见Pthon的身影.这样一门拥有光明前景的语言,他的使用者应该如何划分段位呢? 青铜 对不起,我只能算是卧底. Python的一大特点是入门简单,但这并不意味着你可以轻松入门.我们在工作和生活中都可以见到这样的人,初步掌握了Python语法,但高级技巧和编程思想几乎为0,常见于接触编程两三个月的初学者.刚刚玩转PyCharm,搞懂了变量.常量.数据类型,会写循环.会调函数,但

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

C语言轻松高效学习方法之:多种方法实现

多种方法实现同一个功能,可以调动你学的所有知识去做,有助于你学的融会贯通. 下面举例来看: 实现功能:求一个整数的位数: 实现语言:C语言: 开发环境:Visual Studio 2017 如:3215是4位数 实现原理: 3215/10 = 321 ----1位数 321/10 = 32 ----又是1位数 32/10 = 3 ----又是1位数 3/10 = 0 ----又是1位数 共4位数,且终止计算条件是/10结果为0的时候: 根据这个原理,先写一个最笨的原始方法: 效果: 这种实现方案

轻松学习C语言编程的秘诀:总结+灵感

目前在准备一套C语言的学习教程,所以我这里就以C语言编程的学习来讲.注意,讲的是"轻松学习",那种不注重方法,拼命玩命的方式也有其效果,但不是我提倡的.我讲究的是在方式方法对头.适合你.减轻你学习负担和心里压力的前提下,才适当的抓紧时间. 因此,探索一种很好的学习方法就是我所研究的主要内容. 众所周知,学习C语言并非易事,要学好它更是难上加难.这和你期末考试背会几个题目的答案考上满分没多大关系,也就是说你考试满分也说明不了你学好.学精通了C语言.那么怎么才算学精通C语言?闭着眼睛对自己

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

自动生成小学四则运算题目(C语言)

这个简易四则运算是我在百度上找的博主叫53余雅诗的一篇c语言代码,网址为http://www.cnblogs.com/ys1101/p/4368103.html,功能是可以选择加减乘除进行简易的四则运算,判断对错.我在VS2017上编译没有bug,因为功能只有整数运算,所以我在此基础上加了真分数的四则运算以及统计得分等,最后成功运行程序.我把我的源代码放在github上,地址为https://github.com/xiaofancheng/helloworld.

PAT 1009 说反话 C语言

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格. 输出格式:每个测试用例的输出占一行,输出倒序后的句子. 输入样例: Hello World Here I Come 输出样例: Come I Here World Hello 1 #include<stdio.h> 2 #