C语言 机器数真值、原反补码、位运算与变量地址获取及输出原理

时间:2022-12-12 16:48:43

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 用来存储常用的字符