博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位段的简单使用
阅读量:6776 次
发布时间:2019-06-26

本文共 1075 字,大约阅读时间需要 3 分钟。

  hot3.png

根据K&R书籍记载,位段只能是signed int或者unsigned int类型,位段可以不命名,无名字段(只有一个冒号和宽度)起填充作用,宽度为0的位段用来墙纸在下一字节边界上对齐。对于字段位端的解释根据机器不同有所不同,位段不是数组,没有地址,所以不能使用&取地址。

以此文一个小例子来备忘位段的使用:

#include
#include
#include
struct fbit{ unsigned flag : 1;        //符号位 unsigned ex : 7;          //指数位 unsigned dec : 24;        //小数位};int main(){ float f = 3.1415926; struct fbit f_bit; f_bit = *( struct fbit *)&f; printf("%x %x %x\n",f_bit.flag , f_bit.ex , f_bit.dec );     return 0;}

位段在表达式中会被自动提升转换类型,例子如下:

#include
#include
#include
struct fbit{ unsigned int a:2; int b:2;};int main(){ struct fbit f_bit; f_bit.a = 1; //1+1=10(这里都是二进制处理,因为只是单纯的进行01填充,并没有转换成其它进制),也就                     //是十进制的2,因为a是无符号类型,所以提升类型的时候是高位是用符号位0进行扩展,扩展之后为...0010 f_bit.a += 1; f_bit.b = 1; //1+1=10(这里都是二进制处理,因为只是单纯的进行01填充,并没有转换成其它进制),也就                     //是十进制的2,因为b是有符号类型,所以提升类型的时候是高位是用符号位1进行扩展,扩展之后为...1110 f_bit.b += 1; printf("%d %d\n",f_bit.a,f_bit.b);     return 0;}

所以输出是2,-2

转载于:https://my.oschina.net/nibnat/blog/192116

你可能感兴趣的文章