【C语言】一.数据的存储(整数&&浮点数在内存中的存储||大小端||原码反码补码)

2024-01-09 20:56:09

0x00. 引言

相比其他的博客,本博客就主打一个简单干练,精华萃取。话不多说,直接开搞

0x01. 整数在内存中的存储

我们先来看一个例子

int a=10;
long long b=20;

这里定义了两个变量a和b,从右向左看10赋值给变量a,a的类型是int ,int占四个字节,表明在内存中我们给变量a开辟了四个字节大小的内存空间。同理b被声明为long long类型,在内存中给它分配了8个字节的空间。整数在内存中存的是10的二进制表示吗?

1.原码,反码,补码

整数在内存中存的是补码。不是直接的二进制表示。

原码:即为当前值的二进制表示

反码:符号位(第一位)不变,其他为按位取反(1变0,0变1)

补码:反码加一

值得一提的是正数的原码与补码相同

2.大端字节序/小端字节序

大端字节序(Big Endian)
高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。
小端字节序(Little Endian)
高位字节数据存放在内存高地址处,低位数据存放在内存低地址处

举个例子:

例如:int a=1
假设内存地址从左往右由高到低
0x 00  00  00  01 这就是小端字节序,因为01存在了低地址处
而
0x 01  00  00  00 就是大端字节序,因为01存在了高地址处

如何判断一个机器的大小端呢?

int check_sys()
{
	int a = 1;
	return *(char*)&a;
}

int main()
{
	int ret = check_sys();
	
	if (ret == 1)
		printf("小端");
	else
		printf("大端");
	return 0;
}

3.一道练习题

int main()
{
	char a[1000];
	int i;
	for ( i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d ", strlen(a));//   255,找到0之前的字符个数 -1到-128,127到0,总计128+127=255

	//signed char 取值范围0->127,(-128)->(-1)
	//unsigned char 取值范围0->255 10000000
	return 0;
}

0x02.浮点数在内存中的存储

背景

事实上直到20世纪80年代, 还是计算机厂商各自为战, 每家都在设计自己的浮点数存储规则, 彼此之间并不兼容. 直到1985年, IEEE754标准问世, 浮点数的存储问题才有了一个通用的工业标准.
IEEE754提供了四种精度规范, 其中最常用的是 单精度浮点型 和 双精度浮点型 , 但IEEE754并没有规定32位浮点数类型需要叫做 float, 或64位浮点数需要叫做 double. 它只是提供了一些关于如何存储不同精度浮点数的规范和标准. 不过一般情况下, 如果我们提到 float, 其实指的就是IEEE754标准中的32位单精度浮点数. 如果我们提到 double, 其实指的就是IEEE754标准中的64位双精度浮点数。

正文

推荐看这篇
知乎大佬的文章

0x03.总结

第一次用markdown编辑器,确实比之前的清晰很多,如果对你有帮助,点个赞再走吧

文章来源:https://blog.csdn.net/m0_73865858/article/details/135487462
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。