C语言-无符号数与有符号数不为人知的秘密
一、无符号数与有符号数
1.计算机中的符号位
数据类型的最高位用于标识数据的符号
-最高位为1,表明这个数为负数
-最高位为0,表明这个数为正数
1 #include <stdio.h> 2 3 int main() 4 { 5 char c = -5; 6 short s = 6; 7 int i = -7; 8 9 printf("%d\n", ( (c & 0x80) != 0 )); 10 printf("%d\n", ( (s & 0x8000) != 0 )); 11 printf("%d\n", ( (i & 0x80000000) != 0 )); 12 13 return 0; 14 }
2.有符号数的表示法
在计算机内部用补码表示有符号数
-正数的补码为正数本身
-负数的补码为负数的绝对值各位取反加一
3.无符号数的表示法
在计算机内部用原码表示无符号数
-无符号数默认为正数
-无符号数没有符号位
对于固定长度的无符号数
-MAX_VALUE+1 ->MIN_VALUE
-MIN_VALUE - 1 ->MAX_VALUE
C语言中默认为有符号数类型
unsigned 关键字声明变量为无符号类型
C语言中只有整数类型能够声明unsigned变量
当有符号数遇到无符号数时:
实例分析:
1 #include <stdio.h> 2 3 int main() 4 { 5 6 unsigned int i = 5; 7 int j = -10; 8 9 if( (i + j) > 0 ) 10 { 11 printf("i + j > 0\n"); 12 } 13 else 14 { 15 printf("i + j <= 0\n"); 16 } 17 18 return 0; 19 }
有符号数要转换成无符号数
错误使用unsigned
实例分析2:
1 #include <stdio.h> 2 3 int main() 4 { 5 6 unsigned int i = 0; 7 8 for(i=9; i>=0; i--) 9 { 10 printf("i = %u\n", i); 11 } 12 13 return 0; 14 }
小结:
有符号数用补码表示
-正数的符号位为0
-负数的符号位为1
无符号数用原码表示
-无符号数没有符号位
-无符号数只有表示正数
unsigned只能修饰整数类似的变量
当有符号与无符号数混合计算时,会将有符号数转换成无符号数再进行计算,结果为无符号数