当我们将int转换为double时,存储int的实际地址是否会被更改?

时间:2015-06-06 13:03:51

标签: c casting

我想知道当我们将int强制转换为double时,存储int的实际结果是变更还是增加?因为int是4个字节(假设),当我们得到类型转换加倍8个字节(假设)时,那么现在大小也增加了存储double的值? 如果这是一个愚蠢的问题,请放轻松吗?

5 个答案:

答案 0 :(得分:5)

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

在马库斯的例子中:

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

d是一个全新位置的新变量。原始值i不受影响。但是,如果你开始玩指针,那么你必须要小心:

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

现在,如果double是8字节宽,那么请注意,通过使用p,您/编译器会假定它指向一个内存位置,该内存位置为该变量分配了8个字节的内存。 ; s指向。但事实并非如此,因为实际上它指的是i,它只有4个字节宽(假设int宽4个字节)。

修改

这是一个(相对)最近的编辑,其动机是OP在评论中要求澄清。 OP希望知道:

  

当得到类型转换时,sum的内存地址会发生什么   现在,在存储器

中存储的其他地方的类型值

以及代码:

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

在上面三行代码中实际上有很多内容。但是,重要的是变量sum根本没有被修改。它只被用作参数。为了添加两个变量,您只需要相应的值。在添加之前,编译器很可能将两个变量复制到寄存器中。因为您正在转换为double,所以编译器很可能将sum的值存储在64位宽的寄存器中(假设double为64位宽)并且就是这样。但是,请记住,这是特定于实现的,并且因编译器而异。它不是C标准规定的东西。

此时,如果你想了解更多,你最好编译到Assembly并试图理解它。希望这有帮助!

答案 1 :(得分:2)

这与“-b中存储#include<stdio.h> int main() { char me[20]; printf("What is your name?"); scanf_s("%s", me); printf("darn glad to meet you, %s!\n", me); return(0); } 的中间结果的问题”相同。

简单回答:在编译器管理的临时变量中。这很可能是一个注册。语言标准没有定义这个 - 它为什么要实际?

类型转换实际上类似于NSMutableDictionary(b否定)。这也必须在使用之前存储在某处。

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

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

答案 2 :(得分:0)

  

我想知道当我们将int转换为double时,存储int的实际结果会被更改或增加吗?

因为C中的int和double是两个不同的类型,是的,将int转换为double不会发生在int所在的同一个地方 - 即使这两个类型具有相同的大小。

为了说明:如果施放覆盖原始变量,

的影响是什么
int i = 12;
double d = (double)i;
int i2; 
i2 = i + i; 

编辑:@Dani补充说

  

如果不再使用int,则double可以占用相同的地址。

是的,编译器可以检查是否可以/稍后访问变量,如果有帮助,可以就地进行操作;然而,情况并非如此:

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

答案 3 :(得分:0)

当我们将int类型转换为double时,存储int的实际结果会被更改或增加吗?

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

当我们做的时候

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

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

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

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

Usual Arithmetic Conversion

答案 4 :(得分:0)

演员表的结果可能无法存储在任何地方;事实上,它可能永远不会被计算出来!

如果我有程序片段

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

程序只需要表现转换发生,然后将结果添加到1.0,但只要最终结果正确,程序就可以生成这会以任何方式产生;它甚至不必类似您编写的代码。

e.g。在具有合适的“添加整数和浮点数”指令的机器上,编译器可以选择为您提供使用该指令的程序,而不是执行转换然后添加。