代码之家  ›  专栏  ›  技术社区  ›  user8690050

为什么两个正整数的乘积是负整数?

  •  0
  • user8690050  · 技术社区  · 7 年前

    这学期我修了系统编程课程。 我试图理解其中的逻辑。 这是幻灯片的截图

    slide image

    3 回复  |  直到 7 年前
        1
  •  1
  •   Dancrumb    7 年前

    存储32位有符号整数时,使用位0-30作为数字,位31表示数字的符号。

    现在设置了位31,表示这是一个负数。为了从二进制表示中找出一个负数,你需要取一的补码(翻转所有位),加一,然后在它前面抛出一个负号。

    当你取一的补码时要小心,因为你将自己限制在32位的范围内。。。您不应该包括高于位31的位。

    退房 signed number representations 了解更多信息。

        2
  •  1
  •   Rajesh Iyer    7 年前

    示例程序伪代码

    Print --> ("Size of int: " + (Integer.SIZE/8) + " bytes.");
    int a=50000;
    int b=50000;
    Print --> (" Product of a and b " + a*b);   
    
    Output :
    Size of int: 4 bytes. 
    Product of a and b:-1794967296
    

    4字节=4*8=32位。

    [0牺牲一个正数]

    最大可能正整数=2147483647(大于160000000,因此40000*40000可以) 实际产品50000*50000=2500000000(大于2147483647)

    然而,C标准表示,程序行为在溢出时是未定义的,在少数情况下,C程序在一些现代实现中不起作用,因为它们的溢出并不像作者所期望的那样。 http://www.gnu.org/software/autoconf/manual/autoconf-2.62/html_node/Integer-Overflow.html

        3
  •  0
  •   Atrakeur    7 年前

    这是因为在大多数编程语言中,整数数据类型具有固定大小。

    这意味着每个整数值都有一个定义的最小值和最大值。

    例如,在C中,最大INT为2147483647,最小为2147483648 在PHP 64位中,它是9223372036854775807和-9223372036854775808

    当你试图超过这个值时会发生什么?简单地说,计算机将产生所谓的整数溢出,值将循环回最小值。

    希望它能为你清除一切!