数据在内存中的存储

 1.数据的类型

整形

char   short   int   long   long 

浮点型

float   double  

构造类型

数组  结构体  枚举类型  联合类型

指针

空类型

整形在内存中的存储

对于整形来说在计算机中存储的都是补码,将整形按照进制转换关系转换为二进制即为原码,注意负数的符号位是1正数的符号位是0,对于正数来说,反码补码均与原码相同,对于负数来说,原码的符号位不变,其余位按位取反即为反码,反码加一即为补码。

2.1大小端介绍

大端是指数据的高位保存在内存的低地址中,数据的低位保存在内存的高地址中。小端是指数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中。

写一个可以判断当前机器字节序的代码

#include 
int main(void)
{
	int a = 1;//00000000 00000000 00000000 00000001     0x00 00 00 01 
	char* q = (char*)&a;//大端存储则为 00000001 小端存储则为 01000000
	if (*q == 1)//对取出的一个字节进行判断  01则为小端存储 00则为大端存储
		printf("小端");
	else
		printf("大端");
	return 0;
}

2.2数据在内存中的存储相关练习题目


//输出什么?
#include 
int main()
{
    char a= -2;
    signed char b=-2;
    unsigned char c=-2;
    printf("a=%d,b=%d,c=%d",a,b,c);
    return 0;
}

//-2的原码是10000000 00000000 00000000 00000010  反码是11111111 11111111 11111111 11111101 补码是 11111111 11111111 11111111 11111110 
//因为char类型只占一个字节,则a中为11111110 b中为11111110 c中为11111110  a,b是有符号的则按照符号位补齐是 11111111 11111111 11111111 11111110
//将补码除符号位不变,其余位按位取反得到10000000 0000000 0000000 00000001 加一得到 10000000 00000000 00000000 00000010则a,b均为-2
//c是无符号的数,则前面补零为 00000000 00000000 00000000 11111110   (%d是以10进制的形式打印有符号的整数)则c是2+4+8+16+32+64+128=254

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

//-128的补码是11111111 11111111 11111111 10000000 则a中为10000000  %u表示按unsigned int 格式输出输入数据 
//则为11111111 11111111 11111111 10000000 无符号格式输出计算得到4294967168

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

//128的补码是00000000 00000000 00000000 100000000  则在a中存储的是10000000  11111111 11111111 11111111 10000000
//以无符号格式输出输入则为4294967168

#include 
int main(void)
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	return 0;
}

//i的补码是11111111 11111111 11111111 11101100 j的补码是00000000 00000000 00000000 00001010 
//i和j相加是11111111 11111111 11111111 11110110      
//%d是以10进制的形式打印有符号整数 10000000 00000000 00000000 00001001   补码:10000000 00000000 00000000 00001010 其结果是-10

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

//%u是以unsigned int 格式输入输出 当i是0时打印0,由于i是无符号整数当i减1,-1的补码是 11111111 11111111 11111111 11111111 由于没有符号位
//则将是一个很大的整数,往复循环,打印不会停止。假如我们将i的类型改为int 则屏幕上打印0到9这些数字

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

//一个有符号的char  内存中存储的是二进制的补码,其顺序为 00000000 01111111 10000000  10000001 11111111
//其值依次为0,1,2,3,...... 127   -128  -127 ......-1
//strlen 函数遇见\0停止计算\0的ascll码值是0,则经过255次遇见第一个\0
//则会打印255

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

//一个无符号的char,由于内存中存储的是二进制序列,则为 00000000 00000001 ....... 11111111 为从0到255
//一个char内不可能存储比255更大的数,所以该程序会死循环

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

float   double  long double 等等

根据国际标准754,任意一个二进制数可以表示为下面的形式:

(-1 )^S*M*2^E

(-1)^S表示符号位,S取零为正数,S取1为负数

M表示有效数字,大于等于1,小于2.

2^E表示指数位。

如十进制的3.75写成二进制是11.11 可以表示为(-1)^0*1.111*2^1

如十进制的-3.75写成二进制是-11.11可以表示为(-1)^1*1.11*2^1

对于32位的浮点数来说,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M

对于64位的浮点数来说,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字

你可能感兴趣的:(c语言)