上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。 光参考这些定义,是解决不了这个题的。 下面看看另一个问题,补码~~ 3.计算机存储形式——补码 int a=-1;
printf("%x",a);
首先,看到那个printf了吧,其他都是cout,突然来个printf,是不是很突兀?更绝的是,此处定义了一个a,跟前边根本没关系。 其实,它是题目的提示信息(不是提示的话突然搞这么个输出语句不是蛋疼么,看来这和高考一样,有出题和答题技巧 ),-1输出的ffffffff是提示信息,它提示了你计算机的存储形式——用%x控制输出16进制能看清它在计算机中的的存储形式是补码。 那么什么是补码呢?也算基础知识了,这里就不详细说什么原码、反码、补码的定义和区别了,直接上原码补码换算方法: 补码,顾名思义,互补,补全,也可以参考“集合”的定义,一个全集中有子集A,A和否A,两者相补刚好满。说白了这叫模运算。比如二进制中单个位上进行的就是模运算,1+1 == 2,进位10或者不进位0,原来的位上取都取0.
以八位二进制为例,模为2的八次幂,即1111 1111 + 1,没法用1 0000 0000表示,因为没那么长~~
正数(补码和原码相同):+11 二进制:0000 1011 原码:0000 1011 负数:-7 二进制(这里还不涉及符号,只是二进制数):0000 1111
原码(第一位为符号位,负数符号位1):1000 1111
小结:正数不变,负数除符号位,变反+1,总之,原码补码相加应该等于模的倍数。
|