资讯专栏INFORMATION COLUMN

详解c语言整形和浮点数在内存中的存储

不知名网友 / 2041人阅读

摘要:目录数据在计算机的存储方式补码,反码,原码数据在计算机的存储方式补码,反码,原码整形在内存中的存储整形在内存中的存储整形类型整形类型大端字节序和小端字节序大端字节序和小端字节序浮点数在内存的储存浮点数在内

目录

数据在计算机的存储方式(补码,反码,原码)

整形在内存中的存储:

   整形类型

大端字节序和小端字节序

浮点数在内存的储存


数据在计算机的存储方式(补码,反码,原码)

在32位机器上,计算机储存数据是用32个比特位来储存数据,也就是32个0,其中第一位数为符号位,大多数情况用来表示整数是正的还是负的,我们先从原码说起,1和-1的原码分别为:

正数的反码不变,负数的反码在其原码的基础上符号位不变,其他位按位取反(0变成1,1变成0),即:

 正数的补码还是不变,负数的补码在其反码的基础上加1:

 所以我们可以总结:正数的原码,反码和补码都相同,而负数的原码,反码和补码在转换时才会不同,计算机在储存整形时用的都是补码。

整形在内存中的存储:

   整形类型

我们知道C语言的整形类型有

我们知道char是字符类型,但是char类型储存字符的方式也是储存数字,然后在通过ascii码表转化为对应的字符,所以在这里我也将char当作是整形的一类了。

计算机会分配给不同类型不同的字节大小,也就是可以储存数字的大小:

 对于不同整形无符号的问题,我拿char举个栗子

char类型的最大值和最小值在计算机的存储:

10000000~011111111  10000000为-128(这是计算机规定的),111111111为-127,011111111为127,

所以大小范围是-128到127

而无符号char类型,就是将最后一位符号位变成计算大小的位,即:

00000000~111111111=00000000~01111111+2^8,也就是0到255

大端字节序和小端字节序

在这里我们引入一下内存单元的概念,内存单元代表的是一个字节空间,即8个比特位,计算机会给这个内存空间分配一个地址(其实就是指针)。

当我们创建一个int变量,并且给他赋一个16进制的值 0x11223344,那么计算机会给他连续开辟4个字节大小的空间,他会有4个内存单元,接下来11将会被放在第一个内存单元,22放在第二个内存单元,下面也是一样,那么计算机会怎么给这些内存单元分配地址呢?于是就产生了大端字节序和小端字节序。                                                                       

                                                                         ~两位16进制的范围大小等于8个比特位的范围大小 

大端字节序存储:高字节序的内容放在低地址,低字节序的内容放在高地址
小端字节序存储:高字节序的内容放在高地址,低字节序的内容放在低地址       

 其中:高字节序代表高位数,即11,低字节序代表低位数,

我们可以测试下自己的编译器是大端的还是小端的,

#includeint main(){	int a = 0x11223344;	char* p = (char*)&a;	printf("%0x", *p);	return 0;}

如果运行的结果为44,则为小端,11为大端

浮点数在内存的储存

根据国际标准,任意一个二进制浮点数都可以表示成:

(-1)^S*M*2^E  

(-1)^s表示符号位,-1的s次幂要么是正数,要么是负数PM表示有效数字,M大于等于1,小于2;

2^E表示指数位。                            -----总的来说就是二进制的科学计数法

 

浮点数在内存的存储其实就是S,M和E的存储

单精度浮点型float:最高的一位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

 其中,E的大小0~255

双精度浮点型double:最高的一位是符号位s,接着的11位是指数E,剩下的52位为有效数字M

 其中E的大小0~2047

———————————————————————————————————————————

M的存储:

因为1<=M<2,所以M肯定为1.xxxxxxx,所以标准规定在计算机存储M的时候,不储存第一位数字1,当读取的时候才加上1,这样做的目的是节省一位有效数字,使计算机保存更多其他有效数字。

———————————————————————————————————————————

E的存储:

首先,E在计算机的存储肯定是一个无符号整形,这就意味着,当E为11位,那它的大小范围是0~2047,当E是8位时,它的大小范围为0~255

但是我们知道,在科学计数法表数的示时,它的指数位是可以取负,所以科学家为了使得E表示负数,在将E存储前加上一个中间数字,8位的E的中间数位127,11位的E为1023,这样在读取的时候给E减去这个中间数,在计算的时候E就能当作负数带来计算了。、

E的特殊情况

当E全位0的时候,那么E的真实值位1-127(或者1-1023),接下来在计算的时候M不会再加1,因为E为全0的时候算出来的数是无限接近于0的数,所以干脆就不给M加1,便于表示+0和-0;

当E全为1的时候,如果有效数字全为0,表示+无穷或者-无穷

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125631.html

相关文章

  • C语言基础之操作符详解

    摘要:语言基础之操作符详解操作符的分类算术操作符移位操作符位操作符逻辑操作符逗号表达式表达式求值隐式类型转换算术转换操作符的属性今天就带各位大佬来了解一波语言的操作符。 ...

    snowell 评论0 收藏0
  • 再识C语言(五)

    摘要:注不要移动负数位标准未定义行为这种行为属于标准未定义行为语言中并没有规定移动负数位。按进制位与规则两个二进制数,有则为,全则为。为假的时候,打印语言中表示假,非表示真无论是正数还是负数。 C语言操作符详解 目录 一、算术操作符 二、移位操作符 三、位操作符 四、赋值操作符 五、单目操作符 六...

    BigTomato 评论0 收藏0
  • C语言】从入门到入土(进阶之数据的存储

    摘要:还不清楚原码反码补码的可以到语言从入门到入土操作符篇中的移位操作符处学习一下。比如原码反码补码原码显示值补码数据存放内存中其实存放的是补码补码的表示与存储在计算机系统中,数值一律用补码来表示和存储。 ...

    mcterry 评论0 收藏0
  • 请回答c语言-操作符【入门】

    摘要:操作符的两个操作数必须为整数。函数调用用作为函数调用操作符。访问一个结构的成员结构体成员名结构体指针成员名还是熟悉的栗子在之前的博客请回答语言初识语言下入门的结构体出现过的栗子名字图鉴编号身高重量属性类型 ...

    frolc 评论0 收藏0
  • C语言进阶】☀️数据类型&amp;&amp;整型内存中的存储

    目录 ​  一、数据类型介绍 二、类型的意义 三、类型的基本归类 整型家族 浮点数家族 构造类型(自定义类型) 指针类型 空类型 四、整形在内存中的存储 原码、反码、补码 大小端字节序 为什么有大端和小端? 一道经典笔试题  一、数据类型介绍 数据从大的方向分为两类: 内置类型自定义类型内置类型我们前面已经学习过,如下: char            //字符数据类型 short      ...

    Xufc 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<