zoukankan      html  css  js  c++  java
  • C语言进阶——有符号与无符号02

    在计算机的内部,我们所有的信息都是由二进制数字组成的

    有符号数的表实法:

    • 在计算机内部用补码的方式表实有符号数
    • 正数的补码位正数的本身
    • 负数的补码为其绝对值取反然后加一得到

    例如-7 他在计算机内部的是1111 1001          是这样得到的 7-》111-》0000 0111-》1111 1000-》1111 1001

    无符号整数的表示:

    • 在计算机内部用原码表实无符号整数
    • 无符号整数默认为正数
    • 无符号整数没有符号位

    对于固定长度的无符号整数:

    • max+1=min
    • min-1=max

    C语言中默认为有符号类型,可以通过unsigned来声明无符号类型的整数,特别注意,只有整数可以声明为无符号整数,浮点数没有无符号类型

    代码示例1:

    #include <stdio.h>
    
    int main()
    {
        char c = -5;
        short s = 6;
        int i = -7;
        
        printf("%d
    ", ( (c & 0x80) != 0 ));
        printf("%d
    ", ( (s & 0x8000) != 0 ));
        printf("%d
    ", ( (i & 0x80000000) != 0 ));
        
        return 0;
    }

    这里面可以通过与(位运算)来实验最高位是0还是1

    代码示例2:

    #include <stdio.h>
    
    int main()
    {
     
        unsigned int i = 5;
        int j = -10;
        
        if( (i + j) > 0 )
        {
            printf("i + j > 0
    ");
        }
        else
        {
            printf("i + j <= 0
    ");
        }
        
        return 0;
    }

    这段代码我们应该仔细分析一下,-10+5应该是个负数,可是为什莫会打印 i+j>0。因为在计算无符号和有符号类型做运算时,计算机会把有符号转化为无符号然后才开始进行计算

    示例代码3:

    #include <stdio.h>
    
    int main()
    {
     
        unsigned int i = 0;
        
        for(i=9; i>=0; i--)
        {
            printf("i = %u
    ", i);
        }
        
        return 0;
    }

    这段代码错误的使用了无符号类型,导致不会退出循环,因为无符号类型你0-1后又是一个很大的正数

    dfsaf

     

  • 相关阅读:
    Java 二维数组
    JAVA——运算符
    JAVA——类与对象
    Eclipse无法自动编译出class文件 转
    引导入单用户模式
    安装sql server遇到问题解决方法
    数据结构和算法分析学习
    开源软件
    POP3、SMTP、IMAP和Exchange都是个什么玩意?
    邮件相关名词 MUA, MTA
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9196533.html
Copyright © 2011-2022 走看看