IOS笔记-计算机中的进制 反码补码 和存储细节
1、计算机中的进制
计算机能够识别的只有二进制 0、1
进制就是一种计量的单位
2、常见的进制:
二进制:逢二进一 用0、1来表示,定义一个二进制的数:0b 或者 0B ,0B1010(2)=10(10)
八进制:逢八进一 用0-7之间的数字表示,定义一个八进制的数:0 开头
10进制:逢10进一 用0-9之间的数字表示,定义一个十进制的数(默认)
16进制:逢16进一 用0-9表示16进制中的0-9,用A-F表示16进制中的10-15
定义一个16进制的数,用0x或者0X开头
3、进制的转换问题
10--->2 : 除2取余法,取余数逆序 (把一个10进制的数每次除以2,得到余数)
2---->10: 用二进制的每一位乘以2的(x)次方,
如果是正整数:x从右至左,从0开始依次增1
如果是实数: x从小数部分开始,从左至右,x依次增加1
010101110.10101
10-->8:除8取余,取余数的逆序
2--->8:取出三位(二级制)合成 1位(8进制)
01 101 101= 155
8--->2:取出1(8进制)拆成3位(二进制)
2--->16:取出四位(二进制)合成 1位(16进制)
16-->2 :一拆四,取出1位(16进制)拆成 4位(二进制)
8--->16: 8---->2---->16:先是1拆3,然后4合一
16-->8 : 16--->2---->8 :先是1拆4,然后3合一
4、原码、反码、补码
为什么要引入反码和补码?
存储一个负数,主要还是用来优化计算机的减法运算
原码:一个正数的二进制表示,原码
整数的原码、反码、补码都是一样的
反码:符号位不变,其他位按位(逐位)取反的结果
补码:反码+1
00000000 00001010
取反:11111111 11110101
+1 11111111 11110110 -5
5、位运算
& | ~ >> <<
& 按位与 口诀:同1为1
| 按位或 口诀:有1为1
~ 按位取反 口诀:1变0,0变1
>>右移位 把一个数的二进制位逐位向右移动 a>>1 把a向右移动1位
相当于/2
注意:向右移位,移出的那位删除,左侧补符号位
<<左移位 把一个数的二进制位逐位向左移动 a<<1 把a向左移动1位
相当于*2
注意:
向左移位,有可能会改变一个数的正负性
向左移位,移出的位被删除,右侧补0
任何数和1进行&操作,相当于取这个数的二进制的最后一位。
6、变量在内存中的存储细节
int 4个字节 %d %i
float 4个字节 %f
double 8个字节%f
long 8个字节(64),32位下4个字节
long long 8个字节,
7、变量类型的修饰符
short int 2个字节 %hd
10000000 00000000 -2(15)(-32768)
-1 00000000 00000001
------------------------
01111111 11111111 2(15)-1(32767)
long 8个字节 %ld -2(63) ~ 2(63)-1
long long 8个字节 %lld
signed int 4个字节 %d
unsigned int 4个字节 %u
8、字符型
字符型数据在内存中如何存储的?
字符型单字节(8位)
字符型存储过程 ---->整数--->2进制---->内存(字符对应的整数可以查询ascii码表)
取出字符的过程内存---->二进制--->整数---->查出对应的字符
char ch;
ch='a'; -->97
%d 97
%c a
字符型和整形可以互相转换