【问题标题】:How can an integer variable show a correct value even when the value crosses its range?即使值超出其范围,整数变量如何显示正确的值?
【发布时间】:2015-04-20 13:06:18
【问题描述】:

我已经在带有 Turbo C/C++ 编辑器的 32 位 Windows 7 操作系统上执行了这个程序。

#include<stdio.h>
#include<conio.h>

void main()
{
    int a,b,c,d,e;
    clrscr();

    a = 25000;
    b = 10000;

    c = a + b;

    printf(" The value of c = %d\n", c );

    d = 5000;

    e = c - d;

    printf(" The value of e is %d\n", e );

    getch();
}

当我打印 c 时,我得到值 -30536,因为值 35000 超过了最大值。但是当我在表达式'e = c - d;'中使用相同的c时,我得到正确的值为 30000。 这怎么可能?

【问题讨论】:

  • 溢出/lunderflow。顺便说一句,如果您真的想学习 C 或 C++,请使用甚至是半现代的编译器。
  • 你对25000 + 10000 = -30536很满意,那为什么不-30536 - 5000 = 30000呢?
  • 25000 + 10000 的情况与-30536 - 5000 相同
  • 它没有存储 35000。它是 -30536。回归本源。你怎么能接受25000 + 10000 = -30536
  • 在标准 C 中,您的程序具有未定义的行为。你的编译器是古老的,你应该得到一个符合现代标准的编译器。并了解未定义的行为。

标签: c


【解决方案1】:

让我们摒弃十进制和大脑,使用二进制和 CPU。 int 在这里是 16 位

表达式25000 + 10000(加二进制码很简单)

 01100001 10101000 = 25000
+00100111 00010000 = 10000
 10001000 10111000 = -30536

10001000 10111000 是负的结果 30536 因为第一位是有符号位

现在表达式 -30536 - 5000 (-30536 + (-5000) )

 10001000 10111000 = -30536
+11101100 01111000 = -5000 
 01110101 00110000 = 30000

01110101 00110000这个结果是阳性30000

或者-30536 - 5000你可以用2的补码法来减。这里就不解释了。

【讨论】:

  • 两个表达式都是带有 16 位有符号整数的 UB。当然,您需要提及这一点。或者提问者会认为这是可以信赖的。
  • @DavidHeffernan 在您发表评论之前我正在编辑此内容。总之谢谢
  • 我看不到提到 UB。现在 Rohit 会认为他可以依靠这个。
  • @DavidHeffernan 你能详细说明一下缩写UB。是不是下界了?
猜你喜欢
  • 2021-11-05
  • 2023-03-12
  • 2017-08-10
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2011-08-02
  • 2021-11-18
相关资源
最近更新 更多