C语言数据的存储

1. 数据类型的介绍

char 字符型
short 短整型
int 整型
long 长整型
long long 更长的整型
float 单精度浮点型
double 双精度浮点型
C语言有没有字符串类型呢?

类型的意义:①使用这个类型开辟的内存空间的大小;②如何看待内存空间的视角。

1.1 类型的基本归类

整型:

char: unsigned char;signed char
short: unsigned short;signed short
int: unsigned int;signed int
long: unsigned long;signed long

浮点型:

float
double

构造类型:

数组类型
结构体类型 struct
联合类型 union
枚举类型 enum

指针类型:

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

空类型:

void表示空类型,通常用于函数的返回类型、函数的参数、指针类型。

2. 整型在内存中的存储

数据在内存中以二进制的形式存储。

2.1 原反补码

负整数:原码:按照二进制正常翻译即是;反码:除符号位,其它位依次取反即可;补码:反码+1.
正整数的原码、反码、补码相同。
在计算机系统中,数值一律用补码来表示和存储。原因:使用补码,可以使数据的符号位和数值位统一处理,加减法统一处理(CPU只有加法器),此外,原码和补码的相互转换,其运算过程也是相同的,不需要额外的硬件电路。

2.2 大小端介绍

大端模式:指的是将数据的高位存储在内存的低地址中,低位存储在高地址。
小端模式:指的是将数据的高位存储在内存的高地址中,低位存储在低地址中。(大同小异取反 /dog)
为什么存在大端和小端:在计算机存储中,一个地址单元的大小刚好为一个字节。当我们想要存储一个整型数据(4字节)的时候,就涉及到了将这个数据以什么顺序放入到内存中的问题,所以会出现大端小端来规定这个问题。
1.设计小程序来判断当前机器属于大端还是小端

int main()
{
	int a = 1;
	char *p = (char*)&a;
	if (*p == 1)
		printf("小端!");
	else
		printf("大端!");
	return 0;
}

练习1,判断输出

#include <stdio.h>
int main()
{
	char a = -1;   //补码:11111111
	signed char b = -1;   //补码:11111111
	unsigned char c = -1;   //补码:11111111
	printf("a=%d,b=%d,c=%d", a, b, c);
	//a整形提升:111111111111111111111111 11111111
	//b整形提升:111111111111111111111111 11111111
	//c整形提升:000000000000000000000000 11111111
	return 0; 
}

练习2,判断输出

#include <stdio.h>
int main()
{
	char a = -128;  // 补码:10000000
	printf("%u\n", a);   //整型提升:11111111 11111111 11111111 10000000
	//输出为:4294967168
	return 0;
}

练习3,判断输出

#include <stdio.h>
int main()
{
	char a = 128;   //补码:10000000
	printf("%u\n", a);   //整型提升:11111111 11111111 11111111 10000000
	//输出为:4294967168
	return 0;
}

练习4,按照补码的形式进行运算,最后格式化成为有符号整数

#include <stdio.h>
int main()
{
	int i = -20;               //补码:11111111 11111111 11111111 11101100
	unsigned  int  j = 10;     //补码:00000000 00000000 00000000 00001010
	printf("%d\n", i + j);     //相加:11111111 11111111 11111111 11110110(补码)
	//按照整型输出:10000000 00000000 00000000 00001010    -10
}

练习5,判断输出

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

练习6,判断输出

#include<stdio.h>
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	// -1 -2 -3 -4....-127 -128 127 126 ...3 2 1 0 -1 -2 -3
	//strlrn实质则是寻找\0 (ASCII码值为0),故当遍历到0时,停止遍历
	return 0;  //输出为255
}

练习7,判断输出

unsigned char i = 0;
int main()
{
    for(i = 0;i<=255;i++)
   {
        printf("hello world\n");
   }
    return 0;   //输出为死循环
}

3. 浮点型在内存中的存储

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

(-1)^S * M * 2^E
(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2(存储时不存储小数点前面的1,读取时自动加上小数点前面的1,目的是为了节省1位有效数字)。
2^E表示指数位(存储时32位需加上127,64位加上1023)。

例如:十进制的数9.5,转换成二进制 1001.1,根据标准形式可得出s=0,M=1.0011,E=3。存储到内存中的形式为:0 10000011 00110000000000000000000。
32位的浮点数E占8位,M占23位;64位的浮点数E占11位,M占52位,而s只占一位。此外,E为一个无符号整型数据。但是由于科学计数法中E可以是负数,因此E必须选取一个中间值来表示E真正的数值(这也就是存储时为什么加上127或1023的原因)。另外,指数E从内存中取出时也分为三种情况:
①E不全为0或1,根据存储的原则进行取出;
②E全为0,此时浮点数的指数等于1-127(或1-1023),有效数字M不在加上小数点左侧的1,而是写为0.xxxxx的形式。这样做是为了表示±0,以及接近于0的很小的数字;
③E全为1,这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

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;
}

在这里插入图片描述

1.cahr类型到底是signed char还是unsigned char?
C语言标准并没有规定,取决于编辑器。
但是int是signed int,short是signed short。
2.探讨char类型的取值范围
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮沉丿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值