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

Pri*_*tap 9 c casting

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

ban*_*ace 6

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

在马库斯的例子中:

int i = 12;
double d = (double)i;
Run Code Online (Sandbox Code Playgroud)

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

int i = 12;
double *p = &i;
Run Code Online (Sandbox Code Playgroud)

现在,如果double是8字节宽,那么请注意,通过使用p您/编译器,假设它指向一个内存位置,该内存位置为其指向的变量分配了8个字节的内存.然而这不是真的,因为实际上它指向的i是宽度仅为4个字节(假设宽度int为4个字节).

编辑

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

当得到类型转换时,sum的内存地址会发生什么呢?现在确实存储了存储在其他地方的sum的值

这是代码:

 int sum = 17, count = 5; 
 double mean; 
 mean = (double) sum / count;
Run Code Online (Sandbox Code Playgroud)

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

在这一点上,如果你想了解更多,你最好编译到Assembly并试图理解它.希望这可以帮助!