C语言——关于数据在内存中存储的练习

发布时间:2023年12月24日

大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流
本文由:残念ing原创CSDN首发,如需要转载请通知
个人主页:残念ing-CSDN博客,欢迎各位→点赞👍 + 收藏?? + 留言📝
📣系列专栏:残念ing 的专题实践练习系列专栏——CSDN博客

————————————————————CSDN———————————————————

?

目录

练习1:根据大小端的概念,设计一个小程序来判断当前机器的字节序——百度笔试题

练习2

练习3.1

练习3.2

练习4

练习5.1

练习5.2

练习6

关于浮点数在内存中的存储练习7:


练习1:根据大小端的概念,设计一个小程序来判断当前机器的字节序——百度笔试题

#include <stdio.h>
int check_sys()
{
     int i = 1;
     return (*(char *)&i);
}
int main()
{
     int ret = check_sys();
     if(ret == 1)
     {
         printf("?端\n");
     }
     else
     {
         printf("?端\n");
     }
     return 0;
}

练习2

int main()
{
	char a = -1;
	//100000000000000000000000001
	//111111111111111111111111110
	//111111111111111111111111111
	//存储在a中要发生截断
	//char-a-11111111
	//111111111111111111111111111--整型提升
	//100000000000000000000000000
	//100000000000000000000000001
	signed char b = -1;
	//11111111-b
	unsigned char c = -1;
	//11111111-c
	//000000000000000000011111111-无符合整数提升就高位补0;
	printf("a=%d,b=%d,c=%d", a, b, c);//-1,-1,255
	//%d-十进制的形式打印有符号的整数
	return 0;
}

signed char 的取值范围:-128——127?

unsigned char 的取值范围:0——255

练习3.1

//signed char  的取值范围:-128—127
//unsigned char 的取值范围:0—255
#include <stdio.h>
int main()
{
	char a = -128;
	//10000000-a
	//打印时整型提升
	//111111111111111110000000
	printf("%u\n", a);
	//%u 是十进制的形式打印无符合的整数
	return 0;
}

练习3.2

#include <stdio.h>
int main()
{
	char a = 128;
	//00000000000000000000000010000000
	//100000000-a
	printf("%d\n", a);
	return 0;
}

练习4

#include <stdio.h>
#include<string.h>
int main()
{
	char a[1000];
	//-128~127
	//-1 -2 -3 ....-128 127126...3 2 1 0 -1 -2....
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));//求字符串长度找的是\0,\0 的ASCII码的值是0
	//128+127= 225
	return 0;
}

练习5.1

#include <stdio.h>
unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)//死循环
	{
		printf("hello world\n");
	}
	return 0;
}

练习5.2

#include <stdio.h>
int main()
{
	unsigned int i;
	//死循环
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}
	return 0;
}

练习6

#include <stdio.h>
int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);//跳过整个数组
	int* ptr2 = (int*)((int)a + 1);//跳过一个字节
	printf("%x,%x", ptr1[-1], *ptr2);//ptr1[-1]--*(ptr1—1)
	return 0;
}

关于浮点数在内存中的存储练习7:

//整数的存储方式和浮点数的存储方式不同
#include <stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	//强制类型转换
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

解析:

为什么 9 还原成浮点数,就成了 0.000000 ?

n=9 的二进制序列为:000000000000000000000000000001001

将其进行拆分后得:s=0;E=00000000;M=000000000000000000001001;

由于E全为0;所以浮点数V就写为:

V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)

可以看出V是?个很?的接近于0的正数,所以??进制?数表?就是0.000000。

浮点数9.0,为什么整数打印是 1091567616? ??

?先,浮点数9.0 等于?进制的1001.0,即换算成科学计数法是:1.001×2^3

所以:9.0? = ?(?1)^ 0 ?(1.001)? *2^3

可以知道:S=0;E=3+127=130;M=00100000000000000000000;

所以,写成?进制形式,应该是S+E+M,即0 10000010 001 0000 0000 0000 0000 0000

这个32位的?进制数,被当做整数来解析的时候,就是整数在内存中的补码,原码正是 1091567616 。

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