位域可不可以赋值成0b0110,要看编译器支不支持了。
在AVRGCC中我记得是没有0b这种写法的,应该是C51的扩展语法吧
我表示位的时候喜欢这样搞:
#include<stdio.h>
#include<stdint.h>
#define BIT0 0x1/*使用宏定义来表示位 这样爽多了*/
#define BIT1 0x2
#define BIT2 0x4
#define BIT3 0x8
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
typedef struct _ss_
{
unsigned char a: 4;
unsigned char b: 2;
}ss;
main()
{
ss Kcnt;
Kcnt.a = BIT2 | BIT1;
printf( "%d", Kcnt.a );
system("pause"); //DEV-GCC的扩展的函数:等待任意按键
}
以上程序在DEV-C++中已经验证过,对Kcnt.a赋值BIT4以上的值的时候,会自动忽略超出定义位数以上的值。
对Kcnt.b赋值BIT0~7也不会溢出到Kcnt.a中。
个人对于位域有点理解不清的地方,是因为没有单片机中通过反汇编观察编译出来的代码,不清楚赋值的过程是怎么样的(位与或还是位移?),到底使用位域会不会损失性能?并且位域在移植到不同的单片机(大小端、8/32位)的时候可能出现问题,因此我尽量不用位域
kcnt.a=(0xF1&0x60)>>4,由于(0xF1&0x60)>>4是常量运算,因此编译器会优化掉,所以结果和直接赋值0X6是一样的。不清楚为什么要写的那么复杂。 |