美文网首页
Chapter02-整数的运算

Chapter02-整数的运算

作者: CurryCoder | 来源:发表于2022-07-10 12:23 被阅读0次

1.无符号数的加法运算

  • 下面两个无符号数相加我们希望得到的结果是256,但是实际的运行结果却是0。原因是:a+b的和已经超过了unsigned char类型所能表示的最大值255,我们称这个情况为溢出
    unsigned char a = 255;
    unsigned char b = 1;
    
    unsigned char c = a + b;
    printf("c=%d\n", c)
    
无符号数表示范围.jpg

2.无符号数的加法溢出

  • 对于操作数x和y,两者的取值范围都是大于等于0,小于2的w次方。对于两者相加的和,如果小于2的w次方,那么程序执行的结果与实际情况一致;如果大于或等于2的w次方,此时就会发生溢出。
无符号数的溢出.jpg
  • 变量a和变量b的二进制表示如下图所示,为了使得运算结果 的数据位数保持w位不变,最高位的1会被丢弃。因此,得到的结果相当于减去2的w次方。在C语言执行的过程中,对于溢出的情况并不会报错
数据溢出原理.jpg

3.如何判断无符号数的数据溢出

  • 由于下面函数的两个形参x和y都是大于等于0的,因此两者之和一定大于等于其中的任意一个数。于是,可以使用下面的代码来判断是否发生了溢出。如果返回值为1,表示运算结果正常;如果返回值为0,则表示发生了溢出
    int uadd_ok(unsigned x, unsigned y) {
        unsigned sum = x + y;
        if(sum >= x)
            return 1;
        else
            return 0;  // 发生了数据溢出
    }
    
  • 上述判断条件的正确性:由于x和y都是非负数,x+y的和一定是大于或等于其中的一个数。当发生溢出时,x+y的运行结果等于x加y减去2的w次方。根据y的取值范围可知,y的取值是小于2的w次方。因此,y减去2的w次方是小于0。最终,非负数x加上一个小于0的数后,结果一定是小于x的。由此可以证明,当发生数据溢出时,得到的和小于其中任意一个数(x或者y)

4.有符号数的加法运算

  • 有符号数x和y的取值范围如下图所示,对于补码的加法运算,需要引入一个符号t来表示补码。想要准确的表示有符号数相加的结果,需要w+1位。为了避免数据大小的扩张,最终结果将截断成w位来表示。有符号数的溢出分为正溢出和负溢出,当x+y的和大于等于2的w-1次方时,发生正溢出。此时,得到的结果会减去2的w次方;当x加y的和小于负的2的w-1次方时,发生负溢出。此时,得到的结果要加上2的w次方
有符号数的溢出.jpg
  • 下面的代码表示两个有符号数相加的结果,我们期望的结果是128而实际的结果却是-128。
    char x = 127;
    char y = 1;
    
    char z = x + y;
    printf("z=%d\n", z);  // -128,发生了正溢出
    
    
    char x = -128;
    char y = -1;
    
    char z = x + y;
    printf("z=%d\n", z);  // 127,发生了负溢出
    
正溢出.jpg 负溢出.jpg

5.如何判断有符号数的数据溢出

  • 判断条件:当两个正数相加,得到的结果为负,则说明发生了正溢出;当两个负数相加,得到的结果为正,则说明发生了负溢出。
有符号数加法运算数据溢出判断.jpg

6.无符号数的乘法运算

  • 对于w位的无符号数x和y,具体表示如下图所示。两者的乘积可能需要2w位表示。在C语言中,定义了无符号数乘法所产生的结果是w位。因此,运行结果会截取2w中的低w位。因此,运行结果等于x与y的乘积并对2的w次方取模。
无符号数的乘法运算.jpg

7.有符号数的乘法运算

  • 对于w位的有符号数x和y,具体表示如下图所示。两者的乘积可能需要2w位表示。在C语言中,定义了有符号数乘法所产生的结果是w位。因此,运行结果会截取2w中的低w位。因此,运行结果等于x与y的乘积并对2的w次方取模,然后将无符号数转换成有符号数。
有符号数的乘法运算.jpg
  • 由于乘法指令的执行需要多个时钟周期,很多C语言的编译器试图使用移位和加法、减法来代替整数乘法的操作。对整数的除法运算使用的右移运算,无符号数采用的是逻辑右移,而有符号数采用的是算术右移
整数乘以2的幂转换为左移操作.jpg 整数的乘法转换为左移和加减法运算.jpg
  • 整数的除法可能遇到除不尽的情况,结果总是会朝着向0的方向进行舍入。对于x大于等于0且y大于0的情况,结果总会是向下舍入;当x小于0且y大于0时,结果将向上舍入。
整数的取整运算.jpg

8.参考资料

[1].本文图片来源,侵权必删:https://www.bilibili.com/video/BV13Z4y1V734/?spm_id_from=333.788&vd_source=9e048d0319d701d15b8120b9c8b97d2e

相关文章

  • Chapter02-整数的运算

    1.无符号数的加法运算 下面两个无符号数相加我们希望得到的结果是256,但是实际的运行结果却是0。原因是:a+b的...

  • Chapter02-整数的表示

    1.整型数据类型 C语言支持多种整型数据类型,例如char、short、int等,64位机器上,不同的数据类型所表...

  • Java程序基础--整数运算

    整数运算即使是除法运算,也是精确的,两个整数相除只能得到结果的整数部分。 求余运算用% 注意:整数的除法对于除数为...

  • shell运算详解

    shell中常见的运算命令 运算操作符与运算命令意义(())用于整数运算的常用运算符,效率很高let用于整数运算,...

  • MOD 运算

    mod运算,即求余运算,是在整数运算中求一个整数 x 除以另一个整数y的余数的运算,且不考虑运算的商。在计算机程序...

  • Python的整数与浮点数

    整数和浮点数混合运算的结果是浮点数整数运算中

  • 你可能不知道的python知识点

    基本数据类型 1.整数和浮点数 整数的运算速度更快,所以浮点数运算的时候,可以先把小数点去掉,当成整数运算后,添加...

  • 2019-06-29

    整数相加输出整数运算结果。字符和整数相加会输出字符ASCII码和整数的运算结果。而字符串再加其他类型都为字符串。 ...

  • Python 常用运算

    布尔运算 数字类型 整数类型的按位运算

  • 位运算符

    位运算符 只对整数有效 以32位带符号的整数进行运算,返回值也是一个32位带符号的整数 有符号整数以31位表示整数...

网友评论

      本文标题:Chapter02-整数的运算

      本文链接:https://www.haomeiwen.com/subject/euqibrtx.html