12.机器数与真值
1)机器数
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.
比如,十进制中的数 +3,计算机字长为8位,转换成二进制就是00000011。如果是-3,就是10000011。
那么,这里的00000011和10000011就是机器数。
2) 真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的只有符号数的10000011,其最高位1代表负,其真正数值是-3而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号的的机器数对应的真正树枝称为机器数的真值。
例如:0000 0001的真值 = +000 0001 = +1, 1000 0001的真值 = -000 0001 = -1
13.原码、反码、补码
数据在计算机中的存储方法:
数据在计算机内部是以补码的形式储存的。
引入原码、反码、补码的意义:
为了计算机电路的设计更加简单,计算机只能执行加法,如果执行减法,就等于加上一个负数。这时,反码和补码就有了存在的意义。
1)原码:
一个数绝对值的二进制表示,如果是+: 最高位(最左侧的位) 改0
-: 最高位(最左侧的位) 改1
2)反码:
正: 整数的反码等于原码
负: 除符号位不变,其他位逐位取反(1->0,0->1)
3)补码:
正:正数的补码等于原码
负:1.反码+1;
2.在原码基础上符号位不变,其他位取反,最后再+1;
补码——>原码: 符号位不变,取反+1
14.位运算
①用于整数的二进制位之间的运算
& 按位与 :如果两个位进行&操作,同1则结果为1,有0结果为0 实用:任何数和1进行&运算,可以获取一个数的最低位
| 按位或 : 有1则为1,同0则为0
~ 按位取反 : 1变0,0变1
^ 按位异或 : 相同为0,不同为1
>> 右移位 : 各二进全部右移n位,低位丢弃,高位补0
<< 左移位 : 各二进全部左移n位,高位丢弃,低位补0 注意:左移可能改变一个数的正负性
左移、右移可用于快速计算一个数乘以或除以2的n次方。
②位运算技巧:
可以用来“取二进制”,“判断奇偶数”,“交换两个变量的值”
1)取二进制:分别右移再与1进行&运算;
2)判断奇偶:与1进行&运算,结果为1是奇数,结果为0是偶数;
3)交换变量的值:
方法一:多定义一个变量;
方法二:a = a+b; b = a-b; a = a-b;
方法三:a = a^b; b = a^b; a = a^b;
15.变量地址获取及输出原理
%p输出地址
定义两个变量,都是int类型:
int a,int b;
a的地址大,b的地址小,但是不一定连续。计算机分配内存的时候:从高地址向低地址分配。
先定义的,分配高地址,后定义的,分配低地址。
①内存:内存由若干个1个字节(内存单元)构成的,每个字节(内存单元)有唯一的一个地址。
②变量的储存:低字节存在低地址,高字节存在高地址。
16.改变整形变量所占的存储空间
①改变一个数的符号 表示:原来最高位用作标识的一个数的正负,现在用来参与计算;系统默认的是一个有符号的数
②无符号的数:定义 unsigned int x; 有符号的数:定义 signed int y;
③char型常量的存储问题(Xcode编译器):
1)sizeof('a') = 4; ——>先找到'a'的ascll码的值 97 ——>把97按照int类型进行排列00000000 00000000 00000000 01100001 ——>把四个字节存储在内存中
2)char ch = 'a' ; sizeof(ch) = 1; —— >先找到'a'的ascll码的值 97 ——>把97转换为2进制01100001 ——> 把这一个字节存储在内存中
总结,char类型的常量和变量的存储方式是不一样的
ascll码 0-127 用来存储常用的字符