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));

}

输出结果:

0
1
0

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

2. 有符号数的表示法

在计算机内部用补码表示有符号数:

  • 正数的补码为正数本身
  • 负数的补码为负数的绝对值各位取反后加1
8位整数5的补码为:0000 0101
8位整数-7的补码为:1111 1001
16位正数20的补码为:0000 0000 0001 0100
16位正数-13的补码为:1111 1111 1111 0011

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;
}

输出结果:

0
255

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;
}

输出结果:

i + j > 0

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

6. 错误使用unsigned

#include <stdio.h>

int main()
{
    unsigned int i = 0;
    
    for(i=9; i>=0; i--)
    {
        printf("%u\n", i);
    }
    return 0;
}

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

7. 小结

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

声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

    原文作者:jacob2359
    原文地址: https://www.jianshu.com/p/9e3d1711a152
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞