• 第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只能修饰整数类型的变量

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

  • 相关阅读:
    网络编程__【TCP传输】(重点)【Socket & ServerSocket】
    网络编程__【概述】【UDP传输】【DatagramSocket & DatagramPacket】
    How an Undocumented Immigrant From Mexico Became a Star at Goldman Sachs
    Xml Deserialize
    SQL Server 数据类型映射 (ADO.NET)
    Js基本数据类型常用方法扩展
    Sublime Text 2
    .net 开发人员的瓶颈和职业发展
    一次HTTP请求中的缓存
    中国剩余定理——POJ-1006
  • 原文地址:https://www.cnblogs.com/5iedu/p/5309535.html
Copyright © 2020-2023  润新知