如何处理运算对象的“符号位”依赖与机器?

一、位运算符

位运算符对整数类型的操作数进行操作,并将操作数视为二进制位的集合。

算子函数用法

~

位否定

~表达式

向右移动

expr1 >> expr2

&

位与

表达式和表达式

^

按位异或

expr^expr

|

位或

表达式 |表达式

一般来说,如果操作数是“小整数”c语言的运算符优先级,它的值会自动提升为更大的整数类型。操作数可以有符号或无符号。如果操作数是有符号的并且其值为负数,则按位运算符如何处理操作数的“符号位”取决于机器。另外,此时的左移操作可能会改变符号位的值,因此是未定义的行为。

**对于符号位的处理方式没有明确的规定,因此强烈建议对无符号类型只使用位运算符。

1.左移运算符

左移和右移运算符的内置含义是对其操作数执行基于二进制位的移位操作。首先,根据右操作数的要求将左操作数的内容移动指定的位数,然后将左操作数移位的副本作为结果求值。其中右边的操作数不能为负c语言的运算符优先级,并且值必须严格小于结果中的位数,否则会发生未定义的行为。二进制位或左移(),移出边界的位被丢弃。

左移运算符在右边插入值为 0 的位。

代码如下(示例):

2.右移运算符

右移运算符的行为取决于其左侧操作数的类型:如果操作数是无符号类型,则在左侧插入一个值为 0 的二进制位;如果操作数是有符号类型,则根据情况在左侧插入符号位的副本或值为 0 的二进制位。

代码如下(示例):

//假定char 占8位、int占32位
unsigned char bits = 0233; // 1 0 0 1 1 0 1 1
//bits提升为int类型,然后向右移动3位,最右边的三位被丢弃掉了。
bits>>3;//00000000 00000000 00000000 00010011

3.按位否定运算符

按位取反运算符(~)将操作数逐位取反生成新值,并将0、设为1,将0设为1。

代码如下(示例):

//假定char 占8位、int占32位
unsigned char bits = 0227; // 1 0 0 1 0 1 1 1
~bits;
//bits提升为int类型,往高位添加24个0.(00000000 00000000 00000000 10010111)
//之后在取反 11111111 11111111 11111111 01101000

4.位与运算符

按位与运算符(&),如果两个操作数的对应位置都是1,则运算结果中的位为1,否则为0。

代码如下(示例):

unsigned char b1 = 0145;//0 1 1 0 0 1 0 1
unsigned char b2 = 0257;//1 0 1 0 1 1 1 1
b1 & b2;//                0 0 1 0 0 1 0 1 

5.按位或

位或运算符(|),如果两个操作数的对应位置至少有一个为1,则运算结果中的位为1,否则为0.

代码如下(示例):

unsigned char b1 = 0145;//0 1 1 0 0 1 0 1
unsigned char b2 = 0257;//1 0 1 0 1 1 1 1
b1 | b2;//                1 1 1 0 1 1 1 1 

6.是异或运算符

按位异或运算符(^),如果两个操作数的对应位置有且只有一个为1,则运算结果的位为1,否则为0.

代码如下(示例):

unsigned char b1 = 0145;//0 1 1 0 0 1 0 1
unsigned char b2 = 0257;//1 0 1 0 1 1 1 1
b1 ^ b2;//                1 1 0 0 1 0 1 0

© 版权声明
THE END
喜欢就支持一下吧
点赞107赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容