The___Shy_ 2020-11-25 22:50 采纳率: 57.1%
浏览 22
已采纳

关于强转后内存地址的问题

就是变量在内存里面是成线性排列的,但是现在我用强制类型转换,将相邻两个int型变量a,b中的a转换为double型,那a索取的内存要比原来int型多出4个字节的内存,它应该向哪里索取,毕竟旁边变量b已经占据了a 变量所需的四个字节

  • 写回答

4条回答 默认 最新

  • include_iostream_ 2020-11-28 19:54
    关注

    变量和内存不能这样理解。a=(double)a后a还是int类型,不会变成double类型,这点和python不一样,不能把python的思维带入C中来。在语言中,如果你进行类型强转,强转得到的值只是暂时的,这时它其实不在内存中,而是在CPU的寄存器里,更不会立即写入内存。不同的是,python可以自行保留右值的类型,但C/C++会隐式转换double值到整数再进行赋值。不存在跳过这种隐式转换的方法。

    以你的a=(double)a为例,CPU先从a所在的位置(当然,这一步常常要访存,也可能是直接从cache line读取)取出数据丢进一个能存放32位数值的寄存器里(寄存器本身是没有类型的概念的,它存储的可以是字符,可以是整数,可以是float甚至是没什么意义的脏数据。赋予类型意义的是CPU指令而不是存储器)。在我的编译器上,我看了下汇编码,如果是O2优化,CPU会直接把数据放进XMM寄存器,然后调用cvtsi2ss,cvttss2si指令进行转换。如果没有编译器优化,CPU还要多中转几次,但最终还是要调用这两条指令。(这是x86_64架构的结果,其他指令集和微架构上很可能有不同做法,但都会进行至少两条调用。)这两条调用的含义分别是有符号整数转浮点和浮点转有符号整数,显而易见,前者对应你写的显式强转,后者则是C/C++自动进行的隐式转换。

    这种转换通常没有什么实际意义,但是编译器似乎不会省略它们。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗