初学c语言17(数据在内存中的存储)

一.大小端字节序判断

1.什么是大小端?

大端(储存)模式:

将低字节位储存到高地址处

小端(储存)模式:

降低字节位储存到低地址处

举例:

注意在VS中为小端存储模式,其他机器的可能不同

二.练习

1.1  写一个函数判断该机器的字节序

代码:

#include <stdio.h>
int cheak_sys()
{
	int a = 1;
	return *(char*)&a;
}
int main()
{
	int a = 1;
	int ret = cheak_sys();
	if (ret == 1)
		printf("小端");
	else
		printf("大端");
	return 0;
}

运行结果和解释:

1.2

代码:

#include <stdio.h>
 int main()
 {
 char a = -1;
 signed char b = -1;
 unsigned char c = -1;
 printf("a = %d, b = %d, c = %d", a, b, c);
 return 0;
 }

结果和解释:

补充:

1.3

代码:

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

结果和解释:

1.4

代码:

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

结果和解释:

1.5

代码:

#include <stdio.h>
#include <string.h>
int main()
 {
 char a[1000];
 int i;
 for(i = 0; i < 1000; i++)
 {
 a[i] = -1 - i;
 }
 printf("%d", strlen(a));
 return 0;
 }

结果和解释:

1.6

代码1:

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

代码2:

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

结果和解释:

死循环,unsigned char的范围为0~255,始终跳不出循环

1.7

代码:

#include <stdio.h> 
//X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结果是啥?
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
	printf("%p\n", p + 0x1);//
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

结果和解释:

1.8

代码:

#include <stdio.h>
 //X86
环境
 
⼩端字节序
 
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);
 return 0;
 }

结果和解释:

注意:

X64程序可能会崩溃

原因:

(int)a 在 x64 下可能导致地址截断(int 通常 32 位,而指针 64 位)。  
如果 a 的地址是 0x00007FFD12345678,强制转 int 会丢弃高 32 位,变成 `0x12345678`。  
(int)a + 1 = 0x12345679。  
再转回 int* 时,可能变成 `0x0000000012345679`(高 32 位清零),访问非法地址(导致崩溃或未定义行为)。  

三.浮点数在内存中的储存

1.

补充:1E10代表1*10^10

举例:

2.

补充:

举例:

3.

练习:

代码:

#include <stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:% d\n", n);
	printf("*pFloat的值为:% f\n", *pFloat);
	*pFloat = 9.0f;
	printf("n的值为:% d\n", n);
	printf("*pFloat的值为:% f\n", *pFloat);
	return 0;
}

结果和解释:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值