【问题标题】:casting from double to integer variable从双精度变量转换为整数变量
【发布时间】:2011-12-12 19:26:02
【问题描述】:

我在 Dev C++ IDE 中编写了这个程序。我期待它可能会崩溃。但它显示正确的输出。有人可以解释一下这里的内存是如何分配的。为什么这是有效的。

int main()
{
     int i=10;
     double d=3333333.555 ;
     i=d+d;
     printf(" Value of I after assignment %d",i);
     getch();
}

【问题讨论】:

  • 内存是如何分配的?这是简单的加法。
  • 例如:int i;双 d=3333333.555; i = int (d);
  • 如果我没记错的话,运算的顺序是3333333.555 + 3333333.555(加法运算符),结果是6666667.11(仍然是double)。然后将结果转换为 int(赋值运算符),导致值被截断为 6666667。这是您期望的值吗?
  • 对不起,我认为上述行为是正确的。因为我使用的是 64 位的 Windows 7 操作系统。我试图在'd'中给出很大的值,即(111113333333.555)然后它打印值-2147483648。现在请解释如何处理这种情况。在 UNIX 中,Integer 需要 4 个字节来存储值,但 double 需要 8 个字节。因此,当变量的值大于 64687 时。那么 double 值如何存储在该 int 变量中。
  • 你到底在问什么?为什么不崩溃?内存是怎么分配的?结果值的解释?这里有什么问题?

标签: casting integer double


【解决方案1】:

在 C 中,局部变量和参数保存在寄存器和堆栈中。这意味着只要您在堆栈中有可用空间,它们就会被放在那里,无需显式分配。

事实上,所有的程序都是从默认分配的堆栈开始的,这就是为什么C程序不需要请求更多的内存。

堆栈是如何工作的?好吧...一般来说,有一个寄存器用于保存指向一块内存的指针。每当您进入一个函数时,该寄存器就会被移动,以便它现在指向堆栈的空闲部分,当您离开该函数时,堆栈寄存器的旧值会被恢复。

内部工作有点棘手,但这是大体思路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多