数据在内存中的存储(1)

本文探讨了C语言中的基本数据类型如char、short、int、long等的内存占用和使用范围,强调了补码在存储整型数据中的作用。同时,解释了大端和小端字节序的概念,以及如何通过代码判断系统是大端还是小端。此外,还详细分析了char类型的有符号和无符号特性,以及在存储和打印时可能遇到的情况。
摘要由CSDN通过智能技术生成

基本内置类型

char,short,int,long,long,float,double
类型的意义:1.每种类型开辟内存空间的大小不同,决定它们的使用范围不同
2.决定了看待内存空间中内容的视角,例如,把一个数存进float类型中,无论它是什么,我都把它看作float类型
值得注意的用char类型创建一个变量,不能确定是有符号char还是无符号char,不同编译器下,会有所不同
所以可以将char类型分为3种,char,signed char,unsigned char

整形在内存中的存储

整形在内存中存储的是补码,数据在内存中存储时,由于一个地址存储一个字节,如果存储大于1个字节的数据,就必然会存在将多个字节按照什么顺序存储的问题,这就引出了大端字节序存储和小端字节序存储,简称大端和小端
大端字节序存储:将一个数据的低位字节的数据放在高地址处,将一个数据的高位字节的数据放在低地址处
小端字节序存储:将一个数据的低位字节的数据放在低地址处,将一个数据的高位字节的数据放在高地址处
判断是大端还是小端

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

char类型变量的范围为何是-128~127

下面我们写出char类型补码的所有情况,共有2的8次方种
00000000 --0
00000001 --1

011111111 --127 2的7次方-1
10000000 – -128,由于无法计算,直接翻译成-128,-2的7次方
10000001 – -127
111111111-- -1(补码-1,符号位不变,其他位按位取反,得到原码即-1)
对于无符号位char来说,没有负数,00000000为0,11111111为2的8次方-1=255,范围为0~255
我们以此类推,对于有符号short(16个比特位)来说范围为-2的15次方到2的15次方-1
无符号short为0~2的16次方-1
例1

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

对于a = -1
100000000000000000000000000000001
111111111111111111111111111111110
111111111111111111111111111111111
截断
11111111
存入a中
以%d打印
整形提升
有符号char补符号位
11111111111111111111111111111111
11111111111111111111111111111110
10000000000000000000000000000001
打印-1
对于c
11111111
整形提升
00000000000000000000000011111111
255
例二

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

-127
10000000000000000000000001111111
11111111111111111111111110000000
11111111111111111111111110000001
截断
10000001
整形提升
11111111111111111111111110000001若%u,那么把此看作正数,这就是原码,直接打印
10000000000000000000000001111110
10000000000000000000000001111111若%d,打印-127
127
00000000000000000000000001111111
0111111
00000000000000000000000001111111打印127
-128
10000000000000000000000010000000
11111111111111111111111101111111
11111111111111111111111110000000
截断
10000000
整形提升
11111111111111111111111110000000 %u,直接打印
128
00000000000000000000000010000000
截断
10000000
整形提升
11111111111111111111111110000000 %u 直接打印
所以我们看到当将128存入char a中,以%u打印,那么两次打印结果会相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值