c语言的数据存储

C语言的实数部分

这里存在原码反码补码三种形式

实数部分是通过补码的形式来存储

  • 整形
    整形分为 int short long longlong 等一系列类型他们在计算机的存储方式均为补码
    在讨论补码之前,我们先说说原码和反码
    原码:及为真值 在正常情况下第一位代表符号位 这里以8bit举例 10000001 就表示-1 00000001表示1 如果表示符号位,第一位表示符号位 1表示负数 ,0表示正数.如果数据为unsign即为无符号数则第一位表示数据为不是符号位
    反码:如果符号位第一位是1,则除了符号位其他位按位取反 例如:10000001的反码是111111110 如果符号位位是0,则原码与反码相同.
    补码:如果符号位第一位是1,则反码+1 例如 原码10000001 补码11111111 如果符号位位是0,则原码与补码相同.

总结下来,就是非负数的整形的原码和反码和补码一样 负数的补码是原码按位取反+1,如果负数补码得原码也是补码按位取反+1,其中符号位不动
数据在内存的存储
在这里我在讲解一下大小端的概念
大小端表示数据在存储器中的存放顺序
小端模式:数据的高字节,存放在高地址中。计算机读取数据的方向,是从高地址开始读取的;
大端模式:数据的高字节,存放在低地址中。计算机读取数据的方向,是从低地址开始读取的;
小端模式:
内存中存放顺序:0x12,0x34,0x56,0x78
读取数据方向:从高地址开始读取数据
读取结果:0x78,0x56,0x34,0x12
大端模式:
内存中排存放序:0x78,0x56,0x34,0x12
读取数据方向:从低地址开始读取数据
读取结果:0x78,0x56,0x34,0x12
所以 10的表示形式为 0X00 00 00 0a,放在内存为 0a 00 00 00
在这里分享一个判断大小端的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int i;
	int a = 10;
	char* p = (char*)&a;
	if (*p == 10)
	{
		printf("小端");
	}
	else
		printf("大端");

	
	return 0;
}

char类型的指针一次访问一个字节 可以取出int 的第一位来判断大小端

  • 实数
    浮点数

浮点数存储
其中,“符号位”比较简单,即‘1’代表负数、‘0’代表正数。“指数部分”和“尾数部分”则按照二进制的科学计数法的方式存储
例如 1.5转化为二进制浮点数float类型为1.1 即为1.1*2^0 该数的符号位是0 指数部分为指数+偏移量即为127 尾数为1 在储存期间会忽略那个1.因为每个浮点数都存在 所以1.5 的存储方式为 0 01111111 10000000000000000000000
小端存储

浮点数引用知乎https://zhuanlan.zhihu.com/p/343033661 和 浮点数在内存中的存储方式之简析 - 知乎 (zhihu.com)

至此,C语言的数字类型存储以讲解完毕

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sleepymonstergod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值