位字段
定义
位字段是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。
所有基础的数据类型, 最大的也不过 10 个字节;
我们可以自定义的数据类型 -- struct, 通过把若干类型组合在一起, 让一种类型可以大很多.
我们知道, 一个字节有八个 Bit 组成; struct中的 "位字段" 是以 Bit 为单位的, 这已经是计算机的最小单位, 大小是 char 类型的 1/8.
用途
它主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。
要点
1.C语言允许unsigned int类型,signed int类型或int类型的位字段,分别称为无符号位段,带符号位字段和普通位字段。和普通字符一样,普通位字段可以无符号或带符号。C99允许_Bool类型的位字段。
考虑下面标准C语言声明在采用对二的补码为编码方式的计算机中的效果:
struct S
{
unsigned a:3;
signed b:3;
int c:3;
}t = {-1, -1, -1};
此时t.a,t.b,t.c的值分别为7,-1,-1。
2. 位字段的存储方式:即是用"高位优先",还是"低位优先"。采用位字段的程序,由于存储方式不同,程序是不可移植的。
3.无名位字段
结构中,还可以包括一个无名位字段,提供相邻成员之间的填充,强制结构体按word对齐。
4.包含位字段的结构和其他结构没有区别, 譬如同时包含其他类型的字段:
#include <stdio.h>
struct Bit
{
unsigned b1: 1;
unsigned b2: 1;
float f;
}B;
int main(void)
{
B.b1 = 0;
B.b2 = 1;
B.f = 3.14;
printf("%d, %d, %g\n", B.b1, B.b2, B.f);
return 0;
}
示例1
#include <stdio.h>
struct Bit
{
unsigned a: 1; /* 1 Bit, 取值范围: 0 - 1 */
unsigned b: 2; /* 2 Bit, 取值范围: 0 - 3 */
unsigned c: 3; /* 3 Bit, 取值范围: 0 - 7 */
unsigned d: 4; /* 4 Bit, 取值范围: 0 - 15 */
}B;
int main(void)
{
B.a = 1;
B.b = 3;
B.c = 7;
B.d = 15;
printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d);
return 0;
}
示例2
#include <stdio.h>
struct Bit
{
int b8: 1;
int b7: 1;
int b6: 1;
int b5: 1;
int b4: 1;
int b3: 1;
int b2: 1;
int b1: 1;
}B;
int main(void)
{
unsigned char *p = NULL;
B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
p = (unsigned char *)&B;
printf("%d\n", *p); /* 255 */
B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 1;
p = (unsigned char *)&B;
printf("%d\n", *p); /* 1 */
B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
p = (unsigned char *)&B;
printf("%d\n", *p); /* 15 */
B.b1 = 0; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
p = (unsigned char *)&B;
printf("%d\n", *p); /* 127 */
return 0;
}
分享到:
相关推荐
在IT行业中,编程是至关重要的技能之一,而C语言和C++则是许多程序员入门和进阶的首选语言。本项目“C语言/C++实现图书管理系统”是一个基础的软件开发实践,旨在帮助学习者掌握这两种语言的基本语法以及面向对象...
**SIP协议解析与实现(c/c++)** SIP(Session Initiation Protocol)协议是一种用于创建、修改和终止多媒体通信会话的信令协议,广泛应用于VoIP、视频会议和即时消息等领域。根据RFC3261,SIP设计为简单、可扩展且...
JNI提供了大量API用于在Java和C/C++之间交互,如创建和销毁Java对象、调用方法、访问字段、处理数组、异常处理等。例如: - `env->FindClass(className)`:查找Java类。 - `env->GetMethodID(cls, methodName, ...
MySQL的C/C++ API是开发人员使用C或C++语言与MySQL数据库进行交互的一种接口。这个API提供了丰富的函数和结构,使得程序员能够执行SQL查询、处理结果集、管理数据库连接等操作。以下是对Mysql C/C++ API的详细说明:...
《C/C++公司人事管理系统详解》 在编程领域,C/C++语言因其高效、灵活的特点,常被用于开发各种复杂的系统。本项目“C/C++公司人事管理系统”就是一款为初学者设计的学习案例,旨在帮助他们理解如何用C/C++语言实现...
Java Native Interface (JNI) 是Java语言的一个重要特性,它允许Java代码和其他语言写的代码进行交互,特别是C和C++。JNI在Java平台中扮演着桥梁的角色,弥补了Java跨平台特性带来的性能限制,使得Java能够调用本地...
### C/C++设计模式-2 #### C语言面向对象编程 **面向对象编程**的核心概念包括**封装**、**继承**以及**多态**。在C语言中实现这些概念需要采取一些特殊的技巧。 ##### 封装与继承 尽管C语言本身不支持类的概念...
VScode(Visual Studio Code)是一款轻量级但功能强大的源代码编辑器,广泛应用于各种编程语言,包括C和C++。本压缩包“VScode C/C++配置文件及CMake工程.rar”包含了在VScode中配置C/C++开发环境以及使用CMake构建...
《高质量C/C++编程》与《C语言深度剖析》这两本书是C/C++程序员的宝贵资源,它们分别从不同角度深入探讨了这两种编程语言的核心概念和技术。以下是对这两个主题的详细解析。 首先,《高质量C/C++编程》由林锐编写,...
Java编程语言以其跨平台性和丰富的库受到广大开发者喜爱,但有时我们需要利用C或C++的高效性能和系统级访问能力。在这种情况下,JNI(Java Native Interface)成为连接这两种语言的桥梁。本文将深入探讨如何使用Java...
#### 七、C/C++中的联合体与位字段 联合体(union)是C/C++中另一种特殊的数据类型,它允许在相同的内存区域存储不同类型的变量。这在嵌入式系统中特别有用,尤其是在需要精确控制内存布局,或是需要在硬件寄存器中...
### C/C++常见面试题详解 #### 概念问答题 **1. static关键字在C与C++中的含义** - **C语言中的static**: 在C语言中,`static`主要用于控制变量的可见性和生命周期。 - 当`static`用于变量时,该变量成为静态...
### 操作系统实验一报告——使用C语言/C++实现时间片轮转调度算法 #### 实验背景与目的 本实验旨在通过编程实践的方式,加深学生对于操作系统中的进程调度机制及其核心算法之一——时间片轮转(Round Robin, RR)...
《C/C++编程实现日历系统详解》 在软件开发中,日历系统是一个常见的功能模块,用于显示日期、管理事件等。C/C++作为强大的系统级编程语言,虽然不如高级语言如Python或Java那样拥有丰富的库支持,但仍然可以通过...
《C/C++学生信息管理系统详解》 在编程学习的道路上,C/C++语言以其高效、灵活的特点深受广大程序员喜爱,而构建一个简单的信息管理系统则是学习过程中常见且实用的项目。本篇文章将深入探讨如何利用C/C++语言设计...
《C/C++实现的学生管理系统详解》 学生管理系统是软件工程中的一个典型应用场景,它主要用于管理学生的基本信息、成绩、出勤等数据。本系统采用C/C++编程语言进行开发,虽然可能由于作业性质存在格式混杂的问题,但...
ARM架构下C/C++过程调用标准是ARM应用程序二进制接口(ABI)的一个重要组成部分,它规定了函数调用时的参数传递、寄存器使用、堆栈行为以及数据布局等重要约定。这一标准对于开发者编写与硬件紧密相关的软件尤为重要...