float ,int 的底层实现

yao4lin 2014-08-01 09:07:10
在计算机内部,int,float 都是用二进制表示的,
比如 001100110 如果如果解释成float 或者解释成 int 是两个完全不同的数,计算机底层是如何决定把这个歌二进制翻译成int 或者是float的?
...全文
764 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-08-01
  • 打赏
  • 举报
回复
这个是编译器,或者汇编器决定的。 CPU只提供内存,寄存器,IO端口,中断引脚,读写引脚,地址线,数据线等等,这些东西。 有些CPU不提供浮点部件,这时候, 浮点运算,和浮点类型是编译器,或者汇编器提供的。 有些编译器,或者汇编器,提供浮点部件仿真器, 就是说用软件实现,浮点部件的每一条指令。仿真浮点运算器。 这其实也是一种虚拟机模式。 如果CPU提供浮点运算,或者计算机另外配有浮点部件---数学协处理器 那么就由硬件决定 浮点数的格式 不过 float ,double 是IEEE标准浮点数格式。 格式是固定的float 32Bits,double 64Bits. int 一般和CPU寄存器长度有关,不过也和编译器,汇编器有关 例如C51 ,8Bits51系列,寄存器为8 Bits char 8Bits,int 是16Bits ,long 32Bits,float 32Bits C51 浮点数计算,全部是软件实现的 。 由于C ,C++ 标准没有规定整数类型的固定长度。 同一CPU不同操作系统和编译器,对于int 类型规定的长度是不同的 于是为了区别这些不同,出现了数据模型这种东西。 数据模型(LP32 ILP32 LP64 LLP64 ILP64 ) TYPE LP32 ILP32 LP64 ILP64 LLP64 char 8 8 8 8 8 short 16 16 16 16 16 int 16 32 32 64 32 long 32 32 64 64 32 long long 64 64 64 64 64 pointer 32 32 64 64 64
Ashily_1020 2014-08-01
  • 打赏
  • 举报
回复
这个我感觉楼上都说的挺对的了,在定义数据的时候就已经限定存放数据的类型,内存只是按这个规则保存数据,具体是什么类型的都不用管,如果在编码中有强制转换,再用另一种规则把数据取出来
cyd54454 2014-08-01
  • 打赏
  • 举报
回复
计算机底层是没有各种类型之分的,类型的区分是给人看的。你把某类型的数存入内存,该数被转换成了二进制数,你从内存取某类型的数,取出来的二进制数被转换成你需要的浮点数。至于转换有其一套标准在,没仔细研究过.
float fun()
{
	return 12.34;
}

int main()
{
	float a;
	
	a = fun();
	return 0;
}
上面程序的反汇编如下(只取了fun函数的):

<fun>:
push   %rbp
mov    %rsp,%rbp
mov    $0x414570a4,%eax   //此处0x414570a4就是12.34的16进制表示,这说明了在底层,是没有float的
mov    %eax,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
retq   
guzhijie1981 2014-08-01
  • 打赏
  • 举报
回复
楼主,你忘记还有编译器一层了么? 编译器根据你写的int还是float,翻译成汇编的时候,执行不同的汇编语言,不同的汇编语言,不同的机器码,在CPU哪里就会有不同的单元执行。 这个就是为什么在有些没有浮点运算单元的CPU下,用c写代码,要求你不尽量不写float,因为那个时候,编译器会把你的float数据的操作用只能处理定点数的指令模拟。 以上观点,没有见任何书籍和文章,可能有误,但是我也有过楼主的疑问,但是我仔细的思考过,因为只有这样才能解释有些书本上看起来不清楚的问题。 如果有错误,请指正
mujiok2003 2014-08-01
  • 打赏
  • 举报
回复
CPU听你指挥执行不同的指令。
The_Third_Wave 2014-08-01
  • 打赏
  • 举报
回复
你写代码告诉CPU把接下来几个字节当做int或者float型数据,CPU按约定的规则理解接下来的几个字节。
羽飞 2014-08-01
  • 打赏
  • 举报
回复
楼主说的底层是多底层? 硬件不需要知道你的这个数字是浮点数还是整数,CPU执行的是指令,运算指令一般包括一个运算命令,这个命令就告诉CPU,后面的操作数是整数还是浮点数,然后拿出来当整数或者浮点数,操作数在内存或者CPU操作的寄存器中表现形式还是一样的
dbzhang800 2014-08-01
  • 打赏
  • 举报
回复
计算机底层决定不了这个
707wk 2014-08-01
  • 打赏
  • 举报
回复
百度一下
赵4老师 2014-08-01
  • 打赏
  • 举报
回复

69,744

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧