C语言-数据的存储

>数据类型详细介绍

>整型在内存中的存储:原码、反码、补码

>大小端字节序介绍及判断

>浮点型在内存中的存储解析

一、数据类型详细介绍

C语言类型:

1、内置类型:

char、short 、int、long、long long、float、double

        整形家族:

(unsigned、signed)char/short/int/long

        浮点型家族:

 float、double

2、构造类型:

①数组类型          ②结构体  struct         ③枚举类型  enum          ④联合类型  union

3、指针类型

int *pi;         char *pc;          float *pf;       void *pv

4、空类型

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型

类型的意义:

①使用这个类型开辟内存空间的大小(大小决定了使用范围);

②如何看待内存空间。

二、整型在内存中的存储

变量的创建是要在内存中开辟空间的,而空间的大小是根据不同的类型而决定的。

正数原码、反码、补码都相同;

eg:下面啷个变量在内存中是如何存储的

int a=  20;         //0x00000014

int b=-10;          //0xFFFFFFF6

对于整型来说:数据存储的是补码(原因:使用补码,可以将符号位和数值域统一处理;同时,加减法也可以统一处理(CPU只有加法器)此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路)

原码:直接将二进制按照正负数的形式翻译成二进制;

反码:将原码的符号位不变,其他一次按位取反;

补码:反码加1.

我们会发现在内存中a、b存储分别是补码,但是顺序有点不对

>大小端

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中

小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

也叫大小端字节存储模式

设计一个小程序来判断当前机器的字节序

#include<stdio.h>
//判断当前机器的字节序
check_sys()
{
	int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
		return 1;
	else
		return 0;
}
int main()
{
	int a = 1;
	//返回1,小端
	//返回0,大端
	int ret=check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

代码优化:

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

代码实现:

signed char范围:-128-127(0000 0000-0111 1111和1000 0000-1111 1111)

unsigned char范围:0-255

>浮点型在内存中的存储

float、double、long double

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

分析:具体规则按照IEEE754

#include<stdio.h>
int main()
{
	int n = 9;
	float* pfloat = (float*)&n;
	//00000000 00000000 00000000 00001001
	printf("%d\n",n);
	//(-1)^0*(0.0000000 00000000 00001001)*2^(-126)
	//pfloat小数点后输出6bit,0.000000
	printf("pfloat的值是%f\n", *pfloat);
	*pfloat = 9.0;
	//1001.0
	//(-1)^0*1.001*2^3
	//010000010001000000000000000000000
	//转化为十进制为1091567616
	printf("%d\n", n);
	printf("pfloat的值是%f\n", *pfloat);
	return 0;
}

代码执行:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值