大小端
CPU访存的基本单位是字节
对于数据在内存存储补码时的字节排列顺序是有差异的(对于不同编译器)
数据按照字节,是有高权值位低权值为之分的;内存按照字节是有高地址,低地址之别的
什么是大端小端
大端:指数据的低位保存在内存的高地址中,而数据的高(权)位,保存在内存的低地址中
小端:指数据的低位保存在内存的低地址中,而数据的高(权)位,保存在内存的高地址中
为什么都是补码
使用补码,可以将符号位和数值域统一处理;
同时加法和减法也可以统一处理(CPU只有加法器)
此外补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路(上面已经提到)
深入理解变量内容的存入和取出
signed int b = -10; //存:先转成补码 //原:1000 0000 0000 1010 //反:1111 1111 1111 0101 //补:1111 1111 1111 0110 unsigned int d = -10; //(是否合法?) 可以,存入与变量是否有符号无关 //存(补码):1111 1111 1111 0110
//存:字面数据必须先转成补码,在放入空间当中 //所以,所谓符号位,完全看数据本身是否携带+-号,和变量是否有符号无关! //取:以什么样的形式读取(打印)例:%d(有符号整型打印)%u(无符号整形打印) //取数据一定要先看读取类型,然后才决定要不要看最高符号位 //如果不需要,直接二进制转成十进制;如果需要,则需要转成原码,然后才能识别 //当然,最高符号位在哪里,又要明确大小端
整形取值范围
- 以char为例
1. unsigned char: [0,2^8-1] 2. signed char : [-2^7, 2^7-1] //char等价
特定数据类型,能表示的数据取值范围(范围由多个连续数据构成),本质是多位比特位形成的排列组合的的个数
- 如何理解-128
对于char类型来说(8bite) 0000 0000(表示0)(二进制转十进制) 0000 0001(表示1) ... 0111 1111(表示127) 1000 0001(表示-1) ... 1111 1111(表示-127) but 1000 0000该表示什么?-0吗?计算机不会浪费任何一个空间 对于-128 原:1 1000 0000 反:1 0111 1111 补:1 1000 0000 存入时发生截断(存)补码:1000 0000 补码转原码时(发生截断):0000 0000 对于这种情况,1000 0000定义成为-128 这是一种半计算半定义的方式!
总结规律
整数的取值范围(n表示类型占用多少bite)
无符号: [ 0 , 2 ^n - 1 ]
有符号: [ - 2 ^ ( n - 1 ), 2 ^ ( n - 1 ) - 1 ]