整型在内存中的存储

一.数据类型的介绍

首先我们需要了解一下C语言中常用的数据类型

char -——字符数据类型
short ——短整型
int ——整形
long ——长整型
long long ——更长的整形
float ——单精度浮点数
double ——双精度浮点数

数据类型的意义:
1.使用这个类型可以在系统内存中申请多大的空间
2.可以通过数据类型的视角去看待内存空间

二.类型的分类

1.整型家族

char
short
int
long
其中每一种数据类型都可以分为
signed (类型) 有符号的
unsigned (类型) 无符号的

这里很多人会有点疑惑,为什么char类型属于整型家族?
因为:在计算机中字符是以ASCII值来存储的

2.浮点数家族

float
double

3.构造类型(自定义类型)

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

这里为什么说数组也是构造类型?

int main()
{
	int arr[10] = { 0 };
	// 数组名是arr
	// 类型是 int [10];
	// 我们可以自己定义 类型 和 数组的大小
	return 0;
}

4.指针类型

char* p
short* p
int* p
void* p

5.空类型

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

二.整型在数据中的存储

1.原码,反码,补码

在计算机中整数有三种二进制表达方式,原码,反码, 补码。三种表示方法均有符号位(最高位)数值位两部分,符号位都是用0表示“正”,用1表示“负”

正数的原、反、补码都相同。

负整数的三种表示方法各不相同。
原码:
直接将数值按照正负数的形式翻译成二进制就可以得到原码

反码:
将原码的符号位不变,其他位依次按位取反就可以得到反码

补码:
在反码的基础上加1就可以得到补码

举个栗子:

	int i = 10;
	//原码;00000000000000000000000000001010
	//补码:01111111111111111111111111110101
	//补码;01111111111111111111111111110110

接下来,我们来看几个列子:

列1:

int main()
{
	char a = -1;
	//此时的-1是整型的
	//原码 10000000000000000000000000000001
	//反码 11111111111111111111111111111110
	//补码 11111111111111111111111111111111
	// 
	//此时一个整形的数字被放进 char类型会发生截断
	//char 中存储的补码为 后8位 11111111

	signed char b = -1;
	//补码 11111111

	unsigned char c = -1;
	//补码 11111111

	//此时被打印成整型(char - int),需要进行整型提升 (按原来的类型(有无符号))
	//有符号的用符号位补齐
	//无符号的用0补齐
	//提升之后在转化为原码在打印
	printf("a = %d b = %d c = %d\n", a, b, c);  // 结果为: -1  -1  255
	return 0;
}

列2:

int main()
{
	char a = -128;
	//原码:10000000000000000000000010000000
	//反码:11111111111111111111111101111111
	//补码:11111111111111111111111110000000
	//补码截断;100000000


	//此时的a是以无符号的整型进行打印
	//因此 需要先进行整型提升 100000000 (char 是有符号的)
	//此时最高位为有符号数
	//11111111111111111111111110000000 —补码
	//最后在转化为原码(无符号的,原反补相同)进行无符号打印
	printf("%u\n", a); 
	
	//进行整型的打印
	//需要先转化为原码然后打印  -128
	printf("%d\n", a);
	return 0;
}

列3(涉及到算数转换)

int main()
{
	int i = -20;
	//原码:10000000000000000000000000010100
	//反码;11111111111111111111111111101011
	//补码;11111111111111111111111111101100 

	unsigned int j = 10;

	//无符号数;原反补相同
	//00000000000000000000000000001010

	printf("%d\n", i + j);  //无符号的数和有符号的数相加会进行(算数转换,有符号的转换成无符号的)
	//11111111111111111111111111101100
	//00000000000000000000000000001010
	//11111111111111111111111111110110 //补码相加得到的 

	//转换成原码打印
	//10000000000000000000000000001010  //-10
	return 0;
}

列4(循环)

int main()
{
	unsigned int i; 

	//站在i 的视角 i是无符号的 i >= 0 (判断部分永远成立)
	for (i = 9; i >= 0; i--)
	{
		printf("%d\n", i);
	}
	//死循环
	//原因是;无符号数的整型 >= 0
	return 0;
}

列5

#include <string.h>
int main()
{
	char a[1000] = { 0 };

	int i = 0;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
		//-1 .......-128 127......0 ( \0(结束标志) 的ASCII值就是 0)
		//i = 254时 a[i] = 0

		printf("%d\n", strlen(a));  //255
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清隆綾小路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值