1、根据char的取值范围和unsigned char的取值范围的位数,如char和unsigned char都是8位,char型最高位是符号位,1代表为负数,所以为-2^7-1~~+2^7-1 即 [-128, 127] ,而unsigned char为2^8-1=256 即0~255。如,2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=2^8-1, 取值范围由等比数列求出。
2、从一个小数转换为一个大数,比如 short ——>int,需要做高位的扩展。目前所知,有符号位扩展,和zero扩展两钟。符号位扩展即是把高位段全部赋值为小数的最高位数,比如0xC0转换为0xFFFFFFC0,而 0x70,转换后为0x00000070. zero扩展即是把高位段都赋值为0。据我了解,对于signed类型的转换,用的是符号位扩展,而对于unsigned类型的转换,所用的是zero扩展。其目的是保留了转换之前的真值大小。计算机的数值编码都以补码表示。
3、9与-99的源码为00001001,-9,补码为最高位置1 ,其余取反也就是11110110,然后在最低位加1即可即111101114、#include <stdio.h> #include <stdlib.h>int main() { int i =129; char cha= (char)i; int b = (int)cha; printf("sign extension: %d/n",b); system("pause"); return 1; }int 129 原码为 0x ffff ff81 或低8位是: 1000 0001, 计算机中补码和原码相同(char)i 后变为 1000 0001(int)cha 后,从补码计算可得:1000 0001-1= 1000 0000 高位不变其他取反,原码为 11111 1111 即 -127