【C深入】2_有符号和无符号

关键词:计算机中的符号位、有符号数的表示法、无符号数的表示法、signedunsigned、无符号数和有符号数的混合运算、错误使用unsigned的后果

1. 计算机中的符号位

数据类型的最高位用于识别数据的符号 
* 最高位为1,表明这个数为负数 
* 最高位为0,表明这个数为正数

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;

    printf("%d\n", (( c & 0x80 ) == 0));  // &:表示按位与运算; 0x80对应的二进制为:1000 0000
    printf("%d\n", (( s & 0x8000 ) == 0));
    printf("%d\n", (( i & 0x800000 ) == 0));

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果:

0
1
0
  • 1
  • 2
  • 3

总结:通过以上示例代码可证:正数最高位为0,负数的最高位为1,即最高位为符号位

2. 有符号数的表示法

在计算机内部用补码表示有符号数: 
* 正数的补码为正数本身 
* 负数的补码为负数的绝对值各位取反后加1

8位整数5的补码为:0000 0101
8位整数-7的补码为:1111 1001
16位正数20的补码为:0000 0000 0001 0100
16位正数-13的补码为:1111 1111 1111 0011
  • 1
  • 2
  • 3
  • 4

3. 无符号数的表示法

在计算机内部用原码表示无符号数 
* 无符号数默认为正数 
* 无符号数没有符号位 
* 无符号数最小值为0 
* 无符号数最大值由数据所占内存大小决定

对于固定长度的无符号数 
MAX_VALUE + 1 -> MIN_VALUE 
MIN_VALUE - 1 -> MAX_VALUE

#include <stdio.h>

int main()
{
    unsigned char c = 255;
    unsigned char c2 = 0;

    printf("%d\n", (unsigned char)(c + 1));
    printf("%d\n", (unsigned char)(c2 - 1));

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出结果:

0
255
  • 1
  • 2

4. signedunsigned

  • C语言中变量默认为有符号的类型
  • unsigned关键字声明变量为无符号类型
  • 注意:C语言中只有整数类型(char,short, int,long,等等)能够声明unsigned变量,浮点类型(float, double)不能够声明unsigned变量。

5. 当无符号数遇见有符号数

#include <stdio.h>

int main()
{
    unsigned int i = 5;
    int j = -10;

    if( i + j > 0 ) 
    {
        printf("i + j > 0\n");
    }
    else
    {
        printf("i + j < 0\n");
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

输出结果:

i + j > 0
  • 1

总结:当有符号数和无符号数混合运算时,有符号数就会主动的转换为无符号类型。当有符号数为负数时,转换为无符号数后会是一个很大的正数。

6. 错误使用unsigned

#include <stdio.h>

int main()
{
    unsigned int i = 0;

    for(i=9; i>=0; i--)
    {
        printf("%u\n", i);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出结果:程序进入死循环 
总结:i为无符号类型,i的最小值为0。当i=0时,i–后i的值为unsigned int类型的最大值,因此,i恒大于等于0,程序进入死循环。

7. 小结

  • 有符号数用补码表示 
    正数的符号位为0 
    负数的符号位为1
  • 无符号数用原码表示 
    无符号数没有符号位 
    无符号数只用于表示正数
  • unsigned只能修饰整数类型的变量
  • 当无符号数与有符号数混合计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数。

猜你喜欢

转载自blog.csdn.net/zjy900507/article/details/80907679
今日推荐