当我们将 int 类型转换为 double 时,存储 int 的实际地址是否会发生变化?

When we typecast the int to double does the actual address where int is stored is get changed?

我想知道当我们将 int 类型转换为 double 时,存储 int 的实际结果是否发生了变化或增加?因为 int 是 4 个字节(假设),当我们将其类型转换为 8 个字节(假设)的 double 时,现在大小是否也增加以存储 double 的值? 如果这是一个愚蠢的问题,请对我宽容点?

I want to know that when we typecast the int to double does the actual result where int is stored is get changed or increased?

因为 C 中的 int 和 double 是两种不同的类型,是的,将 int 转换为 double 不能发生在 int 所在的同一位置——即使这两种类型具有相同的大小。

举例说明:如果强制转换覆盖了原来的变量,

会有什么影响
int i = 12;
double d = (double)i;
int i2; 
i2 = i + i; 

是吗?

编辑:@Dani 补充说

The double can occupy the same address if the int is no longer used.

是的,编译器可以在稍后检查变量 will/could 是否被访问,如果有帮助,可以就地进行操作;然而这里不是这样:

  1. 一般来说,您必须假定地址会有所不同
  2. 在这种情况下,类型甚至不具有相同的大小
  3. 在我的示例中,稍后访问 i
  4. 实际上,这不太可能是个好主意——取决于在现代 CPU 上投射后 double 将要发生的事情,它很可能会被写入一个专门的特殊寄存器到浮点处理,这将不是 int 所在的那个。

转换不影响变量和相应的内存。它只是指示编译器如何解释驻留在给定位置的位。

在马库斯的例子中:

int i = 12;
double d = (double)i;

d 是位于全新位置的新变量。原始值 i 不受影响。但是,如果你开始玩指针,那你就得小心了:

int i = 12;
double *p = &i;

现在,如果 double 是 8 个字节宽,那么请注意,通过使用 p you/compiler 假设它指向一个内存位置,该位置为变量分配了 8 个字节的内存它指向的是。然而,这是不正确的,因为实际上它指向 i,它只有 4 个字节宽(假设 int 是 4 个字节宽)。

编辑

这是一个(相对)最近的编辑,由 OPs 要求在评论中澄清。 OP 想知道:

what happens to the memory address of sum when it get typecast does now typecasted value of sum stored somewhere else in the memory

这是代码:

 int sum = 17, count = 5; 
 double mean; 
 mean = (double) sum / count;

上面三行代码其实用处还是挺多的。然而,这里重要的是变量 sum 根本没有被修改。它仅被用作另外的参数。为了添加两个变量,您只需要相应的值。在添加之前,编译器很可能会将这两个变量复制到寄存器中。因为您要转换为双精度数,所以编译器很可能会将 sum 的值存储在 64 位宽的寄存器中(假设双精度数是 64 位宽),仅此而已。但是,请记住,这是特定于实现的,并且会因编译器而异。这不是 C 标准指定的内容。

在这一点上,如果您想了解更多,最好编译成 Assembly 并尝试理解它。希望这对您有所帮助!

当我们将 int 类型转换为 double 时,存储 int 的实际结果是否发生了变化或增加?

不,类型转换只是将变量从一种数据类型转换为另一种数据类型的一种方式。

当我们

int i = 10;
double d = (double)i; 

实际上,我们正在做 arithmetic promotion。因为 double 属于 8 Byteint 属于 4 Byte。因此,不会有任何损失。但反之则不然。

类型转换可以是隐式的,由编译器自动执行,也可以通过使用强制转换运算符显式指定。

通常的算术转换使用以下层次结构执行。

这是与 "in a = b + c * d; where is the intermediate result of c * d stored?" 相同的问题。

简单的回答:在一个由编译器管理的临时变量中。这很可能是一个寄存器。语言标准没有定义这个——为什么要定义它呢?

类型转换实际上类似于-b(b取反)。这也必须在使用之前存储在某个地方。

请注意,原始值未被修改,接收变量无论如何都必须是正确的类型(这就是您不能对接收变量进行类型转换的原因之一)。

int 到 double/float 的转换是由编译器隐式完成的,因此不需要显式转换 - 在这种情况下不应使用它,因为它会隐藏以后更改引起的问题到类型。

转换的结果可能不会存储在任何地方;事实上,它可能根本不会被计算!

如果我有程序片段

int i = 42;
double j;
j = 1.0 + (double) i;

程序只需表现得好像发生了转换,然后将结果添加到1.0,但只要最终结果正确,允许程序以任何它想要的方式产生该结果;它甚至不必您编写的代码相似。

例如在具有合适 "add integer an floating point number" 指令的机器上,编译器可能会选择为您提供一个使用该指令的程序,而不是先执行转换再执行加法。