zoukankan      html  css  js  c++  java
  • 关于编写函数比较两个整数的大小的问题

    这两天在练习C语言基础编程的时候遇到了一道关于编写函数比较两个整数的大小的问题,看似挺简单的,后来查了不少资料发现,还是有些细节问题需要研究的。

    总结:

    1,因为异号相减容易溢出,确保两数是同号后可以用减法。
    2,负整数右移(sizeof(int)*8 -1 )后,得到的是-1而不是1,因为负整数右移是

    算数右移SAR;
    3,注意移位运算的优先级要比加减法低。
    4,不要直接使用31,因为有些系统的int不是32位的。
    5,在计算机中,由于机器码的位数通常是给定的,因此计算机中数的表示范围(允许

    取值范围)是有限的。若两数进行加减运算的结果超出给定的取值范围就称为溢出。当计算过程

    中出现溢出时,必须及时处理。定点机如出现溢出,则要停止运算,进行中断处理。

    6,为了判断“溢出”是否发生,可采用两种检测方法:
            单符号位操作检测方法。这种判断溢出的方法是当操作数中的加数与被加数符号相同

    时,若运算结果的符号与操作数的符号不一致,则表示溢出;否则,表示没有溢出。而当加数

    和被加数符号不同时,相加运算的结果是绝对不会溢出的。

    下面是检测下负整数右移后,得到的是-1而不是1
    (-5)原码:100····0101
          反码:111····1010
          补码:111····1011 (-4)
    负数右移1位:
          补码 :111····1101
     补码-1取反: 10000···0011(-3)

    -5右移31位:
     111····1011(补码)
     移位后:111····1111(补码)
          -1:111·····1110 (反码)
            二进制数:10000····0001 (-1)
    -4  原码:1····0100
        反码:111···1011
        补码:111···1110
    -4右移31位:1111····1111
         1111····1110
         1000····0001  (-1)

  • 相关阅读:
    从nsurlsession、Alamofire到moya
    ssl是tcp的会话层与表示层
    Springboot+Thymeleaf+layui框架的配置与使用
    机械思维 信息思维
    路在何方—价值观、价值链与人生(草稿)
    世界由物质、能量、信息
    http_build_query()函数使用方法
    laravel 远程一对多实例
    MySQL中的float和decimal类型有什么区别
    mysql int(19) float(7,2) decimal(7,2)对比
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2222348.html
Copyright © 2011-2022 走看看