位域

news/2024/5/17 16:56:47 标签: 网络, 扩展, 编译器, 嵌入式, struct, tcp

位域:

       是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

 

#include<stdio.h>

typedef struct tagBit

{

       unsigned char cBit1:2,

                  cBit2:4,

                  cBit3:9;

}BIT_S;

int main()

{

       BIT_S stBit;

       stBit.cBit1 = 3;

       stBit.cBit2 = 15;

       stBit.cBit3 = 5;

 

       printf("%d-%d-%d", stBit.cBit1, stBit.cBit2, stBit.cBit3);

       return 0;

}

问题扩展1:

      如果赋值给位域的值超过了位域所能表示的最大值的时候结果如何呢,

     结果应该是截断。

     举例来说明:比如cBit1定义的位数为2,那么cBit1的最大值为11(10进制为3),如果赋值为5,那输出的结果应该为1,解释如下,5的二进制表示为101,赋值给cBit1后,cBit1只能获得两位的数值,所以cBit1的值只能为01(10进制为1)

问题扩展2:

      如果将一个位域的变量定义的大小比8大结果会怎么样呢,

      结果为编译不通过。

     解释:

     位域的定义是按照1个字节的位数来定义的,1个字节的位数为8,所以位域的定义最大应该为8。举例说明,如果把上边的cBit3定义为9,那编译器就会出告警了,以下是VC6.0的试验结果:

     error C2034: 'cBit3' : type of bit field too small for number of bits

 

总结:

      位域在平时中用的比较少,现在的内存比较大,都不会在乎这点空间。如果把情况放在嵌入式系统或者网络中就不一样了。就拿网络的来说吧,在网络传输中,少点数据肯定比多的要好,把一些标记为按照  位数 来定义,可以省不少空间。好比在TCP 报文中syn这些字段之类的,只有0或者1这两种情况,用普通的unsigned char 来表示也要1个字节,用1位来表示,节省了不少空间。

     这就是本人对位域的理解,欢迎大家提意见。 

 


http://www.niftyadmin.cn/n/780485.html

相关文章

交换机和路由器区别

交换机和路由器两个概念容易让人混淆。 首先从工业标准的网络分层开始说起&#xff0c;第一层也就是物理层&#xff0c;通俗的讲就是那些可以直接通信的那些硬件&#xff0c;没有什么管理功能&#xff0c;最简单的包括就是那根连接着的网线。第二层是数据链路层&#xff0c;这一…

路由原理的简单描述

路由原理简单的讲&#xff1a; 路由器工作在第三层&#xff08;网络层&#xff09;&#xff0c;路由器利用网络层定义的“逻辑”上的网络地址(即IP地址)来区别不同的网络&#xff0c;实现网络的互连和隔离&#xff0c;保持各个网络的独立性。路由器不转发广播消息&#xff0c;而…

计算机网络子网掩码

子网掩码最直接的作用是判断IP地址与另一个IP地址是否在同一个网段内。 下面先简单看一个电脑上IP的基本配置 IP地址&#xff1a;192.168.0.5 子网掩码&#xff1a;255.255.255.0 默认网关&#xff1a;192.168.0.1 如上的例子&#xff0c;IP地址、子网掩码、默认网关。假如现在…

typedef和define的区别

typedef和define的区别 typedef是相当于重新定义一种类型&#xff0c;而define仅仅是简单的字符串替换 常用的陷阱是使用define来使用多个变量的替换&#xff0c;容易出错。 举个例子&#xff1a; 1.#define int * PINTA 2.typedef int * PINTB 使用上边的两种例子来定义两个…

匹配字符串及KMP算法

匹配字符串常见的算法是&#xff0c;匹配字符串在被匹配字符串上一个一个向下移动&#xff0c;如果遇到不匹配&#xff0c;再回退回来&#xff0c;继续匹配下去。 举例&#xff1a; 被匹配字符串S "acabaabaabcacaabc" 匹配字符串&#xff08;也叫模式字符串&#xf…

typedef和函数指针

先看一个例子&#xff1a; typedef int (*pFun)(int a, int b); pFunpFunTest; 在上边的代码中&#xff0c;初看会使人误解&#xff0c;怎么能使用函数指针pFun来声明一个类型呢&#xff1f; 相信很多人和我都有这样同样的感受。 我就先从typedef说起&#xff0c;使用typed…

二维指针趣谈

先看一段代码&#xff1a; #include <stdio.h> void fun(int **ppTemp) { int a 0; int *pTemp &a; printf("The address of pTemp is %d\n", pTemp); *ppTemp &pTemp; printf("The address of ppTemp is %d\n&qu…

VirtualBox上安装CentOS6.4(一)

自己在virtual box中安装CentOS6.4过程&#xff0c;供大家参考&#xff0c;欢迎转载。 虚拟软件很多&#xff0c;常见的有vmware和virtual box&#xff0c;直观上的区别vmware收费&#xff0c;virtual box免费&#xff0c;如果只注意到这一点&#xff0c;那就有一点初级了&…