c语言总结 1.数据在内存中的存储

数据类型

整形家族

  • char //字符类型(分为signed char与unsigned char,signed char 的范围为-128-127,unsigned char 的范围为0-255)
  • short //短整型(分为signed short与 unsigned short,signed short 的范围为-32768-32767,unsigned short的范围为0-65535)
  • int //整形(同short)
  • long //长整形(分为signed long 与unsigned long,signed long的范围为-2147483648-2147483647,unsigned long的范围为0-4294967295)

浮点型家族

  • float //单精度浮点型
  • double //双精度浮点型

构造类型

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

指针类型 空类型

  • void

整形在内存中的存储

  • 原码、反码、补码
    对于整形来说,数据存放内存存放的是补码
  • 大小端介绍
    大端指数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中(例如1的二进制为00 00 00 01,它的大端表示为00 00 00 01)
    小端指数据的低位保存在内存的低地址中,数据的高位,保存在内存的高地址中(1的小端表示为01 00 00 00)
    一道笔试题:设计一个小程序判断当前机器的字节序
int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端");
	else
		printf("大端");
	return 0;
}

之所以用联合体是因为联合体的成员共用同一块内存空间

  • 几个练习
    char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("%d %d %d", a, b, c);

结果为-1 -1 255,因为unsigned char的范围为0-255,不可能为负数,-1为0的前一个,因此为255

unsigned int i;
int main()
{
    for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}
	system("pause");
	return 0;
}

结果为死循环,因为i为unsigned int 型,永远大于0.

  • 浮点型在内存中的存储
    举个例子说明
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;
}

结果为n的值为9,*PFloat的值为0.000000,num的值为1091567616,*PFloat的值为9.000000
因为二进制浮点数可以表示成(-1)^S *M *2^E, (-1) ^ S表示符号位,S=0,表示正数,S=1,表示负数,M表示有效数字,2^E表示指数位.(对于32位的浮点数,最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M.对于64位浮点数,最高的一位是符号位S,接着的11位为指数E,剩下的52位为有效数字M.)
E为一个无符号整数,但是科学计数法中是可以出现负数的,因此存入内存时E的真实值必须加上一个中间数,对于8位的E,中间数为127,对于11位的E,中间数为1023.
E从内存中取出又能分为三种情况:

  • E不全为0或不全为1
    规则为E减去127(或者1023),将有效数字M加上第一位的1
  • E全为0
    规则为E为1-127(或者1-1023),有效数字不加第一位的1,还原为0.xxxx的小数。
  • E全为1
    如果有效数字M全为0,表示无穷大
    1.整数转换为浮点数,9可以表示成S=0,E=0000 0000(E全为0),则M=000 0000 0000 0000 0000 1001,E=1-127=-126,M还原为0.xxxxx的小数,为0.000 0000 0000 0000 0000 1001,即结果为0.000 0000 0000 0000 0000 10012^-126=1.001 * 2^(-126-20)≈0.000000。
    2.浮点数转换为整数,9.0的二进制表示为1001.0,即为1.001 * 2^3=(-1) ^0
    1.001 * 2^3,即S=0,M=1.001,E=3+127=130,则S+M+E表示为二进制为:0 10000010 001 0000 0000 0000 0000 0000,转换为十进制为1091567616 。

你可能感兴趣的:(#,C语言)