• 关于编写函数比较两个整数的大小的问题


    这两天在练习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)

  • 相关阅读:
    约瑟夫环问题拓展 C/C++
    C/C++之STL简介
    详解约瑟夫环问题 C/C++
    HC-SR04超声波传感器
    TCRT5000 红外传感器
    win10的docker无法运行mysql的image,Public Key Retrieval is not allowed
    如何将docker默认的安装位置从C盘改为D盘?
    免费PDF阅读器
    A1B2B3
    动态代理
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2222348.html
Copyright © 2020-2023  润新知