一,原码 反码 补码
(1)用于整数的二进制位,即他们的表示方法为原码,反码,补码。整数分为有符号和无符号。有符号整数二进制位第一位“0”表示为正,“1”表示为负。
(2)正数的原码,反码,补码都相同。
负数的三种表示方式各不相同。
(3)原码:直接将数值按照正负形式翻译成二进制得到原码。
反码:将原码的符号位不变,其它位依次按位取反得到反码。
补码:反码加一得到补码。
注:(补码得到原码,取反加一即可)
其中对于整数来说,在计算器储存其实存放的是补码。
二,移位操作符
(1)<< 左移操作符
移位规则:左边抛弃,右边补0。
eg:
结果为:
(2)>> 右移操作符
移位规则:1,逻辑右移:左边用0补充,右边丢弃。
2,算数右移:左边用原来符号位填充,右边丢弃。
其中右移到底是算数还是逻辑右移,取决于编译器来实现,常见的编译器为算数右移。
注:他们的操作数必须为整数。
三,位操作符:&,|,^,~
(1)& 按位与(二进制数列,两个为1才为1)
(2)| 按位或(二进制数列,有1则为1)
(3)^ 按位异或(二进制数列,相同为1,不同为0)
(4)~ 按位取反(二进制数列,0变为1,1变为0)
注:他们的操作数必须为整数。
eg:不能创建临时变量,交换两数。
第一种方法:
第二种方法:
其中第一种如果相加,当数字巨大时,可能会越界,第二种就完全不用担心。
eg:求整数在内存储存二进制数列中1的个数。
第一种方法:
第二种方法:
第三种方法:
其中第一种为补充,二三种为以上知识点。
操作符的属性:优先性,结合性
优先性和结合性决定了表达式求值的运算顺序
优先性:
如果一个表达式包含多个运算符,各种运算符的优先级是不一样的。
结合性:
如果两个运算符的优先级相同,优先级就没有办法先计算哪个了,这个时候就要看结合性。要看是左结合还是右结合,决定结合的顺序。其中,大部分是从左到右,少部分从右到左,比如赋值运算。
如果感觉记住上面有困难,这个比较简洁
表达式求值:整形提升,算术转换
C语言整形算术运算总是缺少整形类型的精度来进行。因此为了获得这个精度,表达式中字符和短整型的数在使用之前被转换为普通整形,这样的转换被称为整形提升.
整形提升的方法
1.有符号整数提升是按照变量的数据类型的符号位来提升。
2.无符号整算提升,高位不0。
算术转换
如果某一个操作数属于不同类型,那么除非其中一个操作数转换为另一个操作数的类型,否则操作就无法进行,下面的层次体系称为寻常算数转换。
如果某个操作数的类型在上面这个表排名靠后,那么首先要转换为另外一个操作类型后执行运算。