关于位字段的字节问题,求字节数!如下:

【问题1:】
...
struct bit_T
{
unsigned int color : 5;
unsigned int length : 3;
unsigned int weight : 2;
unsigned int i: 4;
} bit_t;
...
printf("%d\n", sizeof(bit_t)); //结果为 4.[为何? 既然是位字段,应该是5+3+2+4=14,应该是2字节啊]

...
struct bit_T
{
unsigned int color : 5;
unsigned int length : 32;
unsigned int weight : 2;
unsigned int i: 4;
} bit_t;
...
printf("%d\n", sizeof(bit_t)); //结果为12.[为何?既然是位字段,应该是5+32+2+4=43,为6个字节啊]

【问题2:】
typedef struct bit_T
{
unsigned int color : 5;
unsigned int length : 32;
unsigned int weight : 2;
unsigned int i: 4;
} bit_t;

这里bit_t就可以替代struct bit_T这个结构体类型;
那么我就应该可以定义一个变量x,如: bit_t x;
可是编译的时候发现出错,不知何故,请指教!

附上我的代码:

# include <stdio.h>

struct bit_field {
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int d : 4;
} bit_field_s;

typedef struct bit_T
{
int color : 5;
unsigned int length : 32;
unsigned int weight : 2;
unsigned int i: 4;
} bit_t;

struct {
char color : 8;
char length : 3;
char :0;
char i: 1;
}bit_c;

int main()
{

printf("%d\n", sizeof(bit_field_s));
printf("%d\n", sizeof(bit_t));
bit_t x; //这里定义一个x结构体变量
printf("%d\n", sizeof(x);
printf("%d\n", sizeof(int));
printf("\n");
printf("%d\n", sizeof(bit_c));
printf("\n");

return 0;

}

我是在看 位字段的时候产生了一些关于字节数的疑问,还有关于为何不能定义结构体变量x有疑问!
多谢各位大神指教!!!

printf("%d\n", sizeof(x));
//这里有错
位字段是按最长成员的长度对齐的,你这里最长是 unsigned int 4个字节,所以编译器必须强制对齐 把结构体的长度变为4的整倍数,如第一个14/4=3 余下的空间用0填充3+1=4达到4的整倍数
43/4=10 10=2=12 //变为4的整倍数 即4字节对齐追问

恩,懂了,但是那个bit_t x; //这里定义一个x结构体变量,怎么提示bit_t 不是一个合法的类型呢?illegal use of this type as an expression

追答

主要是括号问题 我用vc编译时没问题的

追问

哦,好的,多谢啦!!!

温馨提示:内容为网友见解,仅供参考
无其他回答

计算机字节是多少位的?
字节也叫Byte,是计算机数据的基本存储单位。8bit(位)=1Byte(字节)1024Byte(字节)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB 其中:K是千 M是兆 G是吉咖 T是太拉。在电脑里一个中文字是占两个字节的。

位字 字节 有问题!
不可能,有问题。字段为16的英文是16字节,双字节文字是32字节。。

C 语言中一个位域(位段)结构占多少个字节?
结构体总大小为最宽基本类型成员大小的整数倍。当类型相同、位宽之和小于类型大小时,共用一个字节;大于时,占用多个字节。位域字段不能是静态成员,无法使用取地址操作符,因此不存在位域指针。同时,指针变量和double、float类型不能用来指定位数,否则编译会报错。使用有符号类型定义位域时,应避免使用...

varchar2(2000)是多少字节的长度?
4000字节长度。比如,varchar2(100),就相当于varchar2(100 byte),表示最大字节数是100,该字段最多能容纳100个字节,强调空间大小。由于我们描述的是字节,因此,保存汉字等字符时,如果数据库用的是GBK编码,那么一个汉字将占用2个字节,最多能存50个汉字,如果你的数据库用的是UTF8编码,那么一个...

怎么看字符占多少字节
double: 占八个字节,提供15~16位有效数字。问题三:怎么判断 某个字符串 占了多少个字节 sizeof(string);问题四:string怎么看占多少字节 不一定是20个字节,要看数组string[20]本身的数据类型。比如:字符型数组 char string[20] 的字节数是:1*20=20 整型数组 int string[20] 的字节数是...

C51中能否有方法将八个不同的位数据组成一个字节的数据?
在C51中,可以使用位字段(Bit Fields)的方式将八个不同的位数据组合成一个字节的数据。位字段是一种数据结构,可以将一个字节按照位进行分割和访问。以下是一个示例代码,展示了如何使用位字段将八个不同的位数据组成一个字节的数据:include <reg51.h> \/\/ 定义一个位字段结构体 typedef struct {...

1kb等于多少字节?
1KB = 1,024字节 因此,1KB等于1,024字节。字节是计算机数据存储的基本单元,通常由8位二进制数字组成。在信息处理和存储中,字节作为一个整体进行操作,是构成数据字段的基本组成部分。在微型计算机系统中,通常使用字节来衡量存储器的容量。例如,在C++等编程语言中,字符类型(char)通常占用1个字节,...

字段 字节 字符之间的关系
字段:比如一个表的列就称为字段,字节是单位,比如“AB”为2个字节,“中国”为4个字节,注意,汉字每个字为2个字节。字符 是意思是说数据。比如在s_name列中添加名为“张三”的人,“张三”即称为数据,也把"张三"称为其中的字符。 你说字符还不如说字符串吧。你想吧,串要多些吧,呵呵...

IP数据报 首部长度的60字节是怎么来的,下面的看不懂
在IP数据报中有4位bit来标示首部长度,1bit的标示数代表了首部是4个字节长,所以15对应60字节。普通的IP首部长为20个字节长,所以这个标识符值为5即可,60是最大字节长。数据报中有4位bit空位来交给“首位长度”,那填满就是1111,折合十进制的15;如果不填满,写的是0001,折合十进制就是1。填满...

计算机网络:网络层(2)
总长度字段为16位,因此数据报的最大长度为216-1=65535字节。 在IP层下面的每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU( Maximum Transfer Unit)。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层...

相似回答
大家正在搜