c语言关于位字段的

Python021

c语言关于位字段的,第1张

1.x.num1=20,~x.num1就是将20按位取反;20的二进制是00010100,取反则是11101011;最高位为1自然是负数,它刚好是-21的补码。你还原一下看……

2.x.num1<<3是将x.num1左移3位。左移1位是乘以2,左移2位是乘以4,左移3位是乘以8;20x8不就是160吗?

补充一下楼上不确定的地方,以下是C语言的规则:

位字段是有符号和无符号的区别,在声明上不一样。

表达式中,所有小于int类型的整数都会提升为int类型,提升方式是符号位扩展。入参也是一种表达式

表达式中有数据无法用int表达时,所有数据会提升为unsign int,提升方式是左侧补0。

printf对所以%d对应的入参都当成有符号类型,而不管原类型是什么,例如你提供0xFFFFFFFFU,它会输出-1.

print...it.a 这个表达式的执行过程是:

it.a其实没有真正的值,因为它只有符号位。

it.a提升到int类型,符号位扩展达32个1,值为-1

printf收到数据,解释为int,就是-1

输出-1

当it.a是无符号数时

it.a的值为1

it.a提升到unsign int类型,直接左侧扩展31个0,值为1

printf收到数据,解释为int,就是1

输出1