就是变量在内存里面是成线性排列的,但是现在我用强制类型转换,将相邻两个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++自动进行的隐式转换。
这种转换通常没有什么实际意义,但是编译器似乎不会省略它们。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报