【浮点数和整形的储存规则】

文章详细阐述了计算机内部如何存储整数(正整数和负整数)和浮点数,提到了正整数使用原码或补码的形式,负整数采用补码,浮点数遵循IEEE754标准,包括符号位、指数位和尾数的规则。并举例说明了浮点数在存储和取值时的特殊处理情况。
摘要由CSDN通过智能技术生成

整数的储存规则

正整数

正整数 在计算机中 是以原码的形式 存储的。你也可以说是 补码 或者 反码,因为 正整数的 原码,反码 和补码 是一样的。

负整数

负整数 在计算机中 是以 补码的形式 存储的。 负数的 补码 = 负数的 反码 (即原码 的 非 符号位 取反) + 1

浮点数的储存规则

根据IEEE(电气电子工程师学会)754标准,一个任意的二进制浮点数可以表示成下面这种形式

(-1)^S * M * 2^E
1.其中(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数
2.M表示有效数字,范围为大于等于1,小于2
3.2^E表示指数位

规定32位的浮点数的符号位是S,接着的8位是E,最后的23位是M
在这里插入图片描述

规定64位的浮点数的符号位是S,接着的11位是E,最后的52位是尾数M
在这里插入图片描述
对于存储浮点数特别规定:
1.因为有效数字M为1.xxxx,所以规定 存储时的尾数M是有效数字去掉1后的二进制序列
2.因为指数位E可能为负数,所以规定存储时的阶码E是指数位E偏移量,对于32位浮点数来说,偏移量是127,对于64位浮点数来说偏移量是1023

对于取出浮点数时特别规定:
1.E不全为0或1
因为存储浮点数时将有效数字的1去掉了,所以正常情况下取出浮点数的有效数字时需要将去掉的1补回来,取出浮点数的指数位时需要将内存存储的E减去偏移量,才能得出原本的E。

2.E为全0的情况
取出来时,要把E还原成真实指数值需要在E的基础上减去偏移量,如果E全为0,那么指数值为1-127或1-1023
此时有效数字M不在加上第一位的1,而还原成0.xxxxx这样的小数
这样做是为了更好的表示±0以及接近于0很小的数字

3.阶码E全为1
如果E全为1,真实指数值就是E的值加上偏移量,最后的还原出来的小数在float类型里面表示是±无穷大(正负取决于符号位S)

#include<stdio.h>
int main() 
{
    int a = 9;
    float* b = (float*) & a;
    printf("a = %d\n", a);
    printf("float* b = %f\n", b);
    *b = 9.0;
    printf("a = %d\n", a);
    printf("float* b = %f",*b);
    return 0;
}


以float类型来看所存储的整型9
00000000 00000000 00000000 00001001
根据取浮点数的规则,此时E为全0,所以打印的结果为0.000000

在根据浮点数的储存规则9.0的二进制应为
0 10000011 00100000000000000000000
根据取正整数值的规则,此时a为1091567616,所以打印结果为1091567616

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值