1.正数的原码、反码、补码相同,负数的反码是原码除符号位的所有位取反;负数的补码是反码加1。
2.为什么使用反码? 因为在直接用负数的原码计算会得到错误答案(如-1+2),因此先将原码转变为反码再进行计算,最后再转变为原码就能得到正确答案。
3.引入补码是为了消除正0(00000000)和负0(10000000)的区别,
将负零转换为补码,那么后八位就是八个0,与正零一样,消除了0的歧义。
4.为什么byte的取值范围是[-128, 127],为什么多出-128,因为正常来说所有数都有原码、补码、反码,但是1000 0000经计算原码是0000 0000,但是按道理说0000 0000的补码应该是本身,所以产生了矛盾,因此规定1000 0000 为特殊的补码(-128)。
5.计算机的内部硬件主要是基于加法运算设计的,因为加法运算快且结构简单。
6.为什么int和float都是4个字节,但是int和float所表示的大小不同,因为float采用了不同的表示方式,如下图是一个32位的float数的表示方式:
这32位被分为1个符号位、8个指数位和23个分数位,计算公式如上图右下角。
7.第一次知道,ASCII码是使用一个字节的低七位表示字符的,所以最多只能表示128个不同的字符。
GBK — 汉字。
Unicode—统一码,所有字符等长编码。
UTF-8,Unicode的一种,可变长度的编码。一字节同ASCII码,n字节(n>1),将首个字节的高n位设置为1,第n+1位设置为0,从第二个字节开始,将每个字节的高两位设置为10,其余填充Unicode码点。
UTF-16,等长字节2或4
UTF-32,等长4字节。
8.记一个好玩的,python中的str使用Unicode编码,存储的字符长度取决于字符串中最大的Unicode码点,如果字符串全部都是ASCII字符,每个字符占用1字节,如果字符超过了ASCII,但全部在基本多语言平面(BMP)内,则每个字符占用2字节,超过BMP用四字节。
9.等长编码,如固定2字节编码,很容易计算出对应标签数i的位置,如2*(i-1),所以复杂度是O(1),而非等长则需要遍历了,所以复杂度是O(n)。
10.逻辑结构:线性和非线性; 物理结构:数组和链表。