第2课 有符号和无符号数

1. 数据类型

1.1 计算机的符号位:数据类型的最高位用于标识数据的符号最高位为1——负数,最高位为0——正数)

【编程实验】

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;
 
    //判断最高位是否是0,0表示正数,1表示负数
    printf("%d
", ((c & 0x80) != 0 ));      //1,按位与,结果非0为负数
    printf("%d
", ((s & 0x8000) != 0));     //0,为正数
    printf("%d
", ((c & 0x80000000) != 0));  //1,为负数
 
    return 0;
}

2. 有符号数的表示法

(1)在计算机内部用补码表示有符号数

  ①正数的补码为正数本身

  ②负数的补码为负数的绝对值各位取反加1

    8位整数 5的补码为:   0000 0101

    8位整数-7的补码为:   1111 1001

    16位整数20的补码为:  0000 0000 0001 0100

    16位整数-13的补码为: 1111 1111 1111 0011

3. 无符号数的表示法

(1)在计算机内部用原码表示无符号数

  ①无符号数默认为正数

  ②无符号数没有符号位

(2)对于固定长度的无符号数

  ①MAX_VALUE+1  → MIN_VALUE

  ②MIN_VALUE-1  → MAX_VALUE

(3)signed和unsigned

  ①C语言中变量默认为有符号的类型

  ②用unsigned关键字声明变量为无符号类型——只有整数类型能够声明为unsigned(浮点数不能声明为无符号数)

    int i;  //默认为有符号整数

    signed int j; //显式声明变量为有符号整数;

    unsigned int k ; //声明为无符号整数

【编程实验1】当无符号数遇上有符号数时→有符号会被看作无符号数!

#include<stdio.h>

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

    if ((i + j) > 0)   //j转换为无符号数,变成为大的正数
    {
        printf("i+j>=0
"); //该结果为运行后最终的输出结果!
    }
    else
    {
        printf("i+j<=0
");
    }
 
    return 0;
}

【编程实验2】错误地使用unsigned

int main()
{
    unsigned int i = 0;     //无符号数永远为正数,即最小值为0

    //当i减小到为0时,然后再减1就变成无符号int型数的最大值,
    //以下代码会进入死循环,所以不应用无符号数来作为循环变量!
    for (i = 9; i >= 0; i--) //i为负数即退出循环,但i为无符号数,不可能为负数
    {
        printf("i=%u
", i);
    }
    return 0;
}

4. 小结

(1)有符号数用补码表示

(2)无符号数用原码表示

(3)unsigned只能修饰整数类型的变量

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

原文地址:https://www.cnblogs.com/5iedu/p/5309535.html