1.二进制
1.二进制转十进制
十进制的每一位都有自己的权重。十进制的数字从右向左是个位,十位,百位······
每一位的权重分别是10^0,10^,10^2······
二进制怎么做也显而易见了。
2.十进制转二进制
短除法:
还可以用计算器(正常情况下谁闲的手算)
3.二进制转八进制和十六进制
1*二进制转八进制
八进制的数字每一位最大是7,用二进制表示为111
因此,一个八进制数字的每一位是由三位二进制组成的
如:0:000 1:001 2:010 3:011 4:100 5:101 6:110 7:111
因此在2进制数转8进制数时,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进位,剩余不够3个2进制位直接换算
在使用printf函数时打印以“0”开头的数字,编译器会认为是8进制的数字再转化为十进制
即:以“0”为前缀的数字会被计算机当作八进制数
2*二进制转八进制
16禁止的数字每一位是0~9,a~f的数字,与上文相同,这些数字各自写成2进制,最多有4个二进制位就足够了。
因此,在2进制转116进制数时,从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位剩余不够4个2进制位的直接换算。
与八进制类似,以”0x“或”0X“为前缀的数字会被计算机当作十六进制数
#关于8进制与16进制还可以翻看《C PRIMER PLUS》的P40~P41
2.原码、反码、补码(这里不涉及小数(浮点数))
整数的2进制表示方法有三种,即···^······
三种表示方法均有符号位和数值位两部分,符号位均用0表示正,用1表示负,数值位最高的一位被当做是符号位,剩余的都是数值位。
正整数的“原反补”均相同
负数的则各不相同
原码:直接将数值按照正负数的形式翻译成的2进制位得到的就是原码;
反码:将原码的符号位不变,其他依次按位取反就可以得到反码;
补码:反码+1就得到补码。
#原码与补码的转换,均可以“符号位不变,按位取反再+1”
对于整形来说:数据存放内中其实存放的是补码
1.用补码,可以将符号位和数值位统一处理;
2.同时,加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码互相转换,其运算过程是相同的,不需要额外的硬件电路。
例如:计算1-1=0
可以看成1+(-1)=0
先用原码计算,发现得到的结果是“-2”,显然不行。
用补码计算,得到的结果进1位,但int类型只能存储32位比特,因此进位得到的1被丢掉了,得到的结果正确
3.移位操作符
<< 左移操作符
>> 右移操作符
注意:移位操作符的操作数只能是整数
1.左移操作符<<
移位规则:左边抛弃,右边补0
移位某个变量的值并不改变这个变量本身,如果将移位后得到的值赋给原来这个变量,它的值才会改变
4.位操作符:&、|、^
# ^指二进制位
&(按位与):对应的2进制位上有0则为0,两个同时为1才为1
|(按位或):对应的2进制位上两个同时为0才为0,有1则为1
^(按位异或):对应的2进制位上相同则为0,相异则为1
tip:"^"是支持交换律的
“~”——按位取反操作符:二进制位是0的变成1,是1的变成0(连符号位都算)
5.逗号表达式
就是用逗号隔开的多个表达式
从左向右依次执行。最后一个表达式的结果作为整个表达式的结果
tip:在执行表达式的过程中可能会遇到结果为假(false)的表达式,但并不影响逗号表达式的结果的执行过程,也不影响最后一个表达式的结果作为逗号表达式的结果。
6.下标访问[]\函数调用()
1.下标引用操作符[]
[]的操作数:一个数组名+一个索引值(数组下标)
如果创建一个数组:int arr[10]
[]的操作数即为arr & 9.
2.函数调用操作符()
接受一个或多个操作数:第一个操作数是函数名剩余的操作数就是传递给函数的参数。
()至少要有一个操作数,即函数名。
e.g:int ret = Add(2,3)
*sizeof 是不是函数呢?——不是函数。是操作符
7.操作符的属性:优先级、结合性
这两个属性决定了表达式求值的计算顺序
8.表达式求值
表达式求值之前要进行类型转换,当表达式中的值转换到适当的类型,才开始计算