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
", ( (c & 0x80) != 0 ));
10     printf("%d
", ( (s & 0x8000) != 0 ));
11     printf("%d
", ( (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
");
12     }
13     else
14     {
15         printf("i + j <= 0
");
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
", i);
11     }
12     
13     return 0;
14 }

小结:

有符号数用补码表示

  -正数的符号位为0 

  -负数的符号位为1

无符号数用原码表示

  -无符号数没有符号位

  -无符号数只有表示正数

unsigned只能修饰整数类似的变量

当有符号与无符号数混合计算时,会将有符号数转换成无符号数再进行计算,结果为无符号数

原文地址:https://www.cnblogs.com/lemaden/p/10081407.html