c语言的数据存储

c语言的数据存储,第1张

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
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语言的数字类型存储以讲解完毕

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1499211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存