1. 计算机中的符号位 l 数据类型的最高位用于标识数据的符号 A. 最高位为1,表面这个数为负数 B. 最高位位0,表面这个数为正数 2. 有符号表示法l 在计算机内部用补码表示有符号数 A. 正数的补码为正数的本身 B. 负数的补码为负数的绝对值各位取反后加1 8位整数 5的补码位:0000 0101 8位整数 -7的补码位:1111 1001 16位整数 20的补码位:0000 0000 0001 0100 16位整数 -13的补码位:1111 1111 1111 0011 C. C语言中用二进制代码表示(前加0b): //-7的二进制计算过程: //00000111(7)===>11111000(取反)===>11111001(加1) char c = 0b11111001;//-7 3. 无符号表示法l 在计算机内部用原码表示无符号数 l 对于固定长度的无符号数 A. MAX_VALUE+1 ——> MIN_VALUE B. MIN_VALUE-1 ——> MAX_VALUE 4. signed和unsignedl C语言中变量默认为有符号的类型 l unsigned 关键字声明为无符号类型 l C语言中只有整数类型能够声明unsigned变量 l 当有符号和无符号进行运算时,有符号类型会自动转变为有符号类型来进行运算 int test2() { unsigned int i = 5; int j = -10; if ((i + j) > 0) { printf("i+j>0n"); } else { printf("i+j<=0n"); } return 0; } l unsigned类型错误使用案列 int test3() { unsigned int i = 0; //i是无符号数,最小值为0,当进行减1时,会变为无符号的最大值,所以程序会进入死循环 for (i = 9; i >= 0; i--) { printf("i=%un", i); } return 0; } 5. 小结l 有符号用补码表示 A. 正数的符号位为0 B. 负数的符号位为1 l 无符号用原码表示 A. 无符号数没有符号位 B. 无符号数只用于表示正数 l unsigned 只能修饰整数类型的变量 l 当无符号与有符号数进行计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数
|