不同类型的变量在内存中存储的详细情况

 

一、int型变量在内存中存储详细情况

  1. //By Richard
  2. #include <stdio.h>
  3. #include <math.h>
  4. int main()
  5. {
  6. int i1=0;
  7. int i2=1;
  8. int i3=-1;
  9. int i4=127;
  10. int i5=-127;
  11. int i6=128;
  12. int i7=-128;
  13. int i8=255;
  14. int i9=-255;
  15. int i10=256;
  16. int i11=-256;
  17. int i12=(int)pow(2.0,16)-1;//65535
  18. int i13=-(int)pow(2.0,16)+1;//-65535
  19. int i14=(int)pow(2.0,16);//65536
  20. int i15=-(int)pow(2.0,16);//-65536
  21. int i16=(int)pow(2.0,24)-1;//16777215
  22. int i17=-(int)pow(2.0,24)+1;//-16777215
  23. int i18=(int)pow(2.0,24);//16777216
  24. int i19=-(int)pow(2.0,24);//-16777216
  25. int i20=(int)pow(2.0,31)-1;//2147483647,最大值
  26. int i21=-(int)pow(2.0,31)+1;//-2147483647
  27. int i22=(int)pow(2.0,31);//超出范围,溢出,从最小值-2147483648循环
  28. int i23=-(int)pow(2.0,31);//-2147483648,最小值
  29. /***************************************************************
  30. * 在return 0上打上断点,F5开始调试,Alt+6查看内存
  31. * 要想查看哪个变量在内存中的存储情况,在地址栏输入&+变量名,比如说:&i1
  32. * int型占4个字节,注意:内存中的存储顺序和实际的字节表示刚好相反
  33. * 比如说:10,在内存中表示为0a 00 00 00,而实际中表示为00 00 00 0a
  34. * 负数的二进制数:对应的正数的二进制数每一位取反,再加1
  35. * int型最高位表示符号:1,表示负数,0表示正数(内存中的最后一个字节的第一位表示)
  36. * 具体来分析:
  37. * 0 :00 00 00 00
  38. * 1 :01 00 00 00
  39. * -1 :ff ff ff ff(00 00 00 01->ff ff ff fe->ff ff ff ff)
  40. * 127 :7f 00 00 00
  41. * -127 :81 ff ff ff(00 00 00 7f->ff ff ff 80->ff ff ff 81)
  42. * 128 :80 00 00 00
  43. * -128 :80 ff ff ff(00 00 00 80->ff ff ff 7f->ff ff ff 80)
  44. * 255 :ff 00 00 00
  45. * -255 :01 ff ff ff(00 00 00 ff->ff ff ff 00->ff ff ff 01)
  46. * 256 :00 01 00 00
  47. * -256 :00 ff ff ff(00 00 01 00->ff ff fe ff->ff ff ff 00)
  48. * 65535 :ff ff 00 00
  49. * -65535 :01 00 ff ff(00 00 ff ff->ff ff 00 00->ff ff 00 01)
  50. * 65536 :00 00 01 00
  51. * -65536 :00 00 ff ff(00 01 00 00->ff fe ff ff->ff ff 00 00)
  52. * 16777215 :ff ff ff 00
  53. * -16777215 :01 00 00 ff(00 ff ff ff->ff 00 00 00->ff 00 00 01)
  54. * 16777216 :00 00 00 01
  55. * -16777216 :00 00 00 ff(01 00 00 00->fe ff ff ff->ff 00 00 00)
  56. * 2147483647 :ff ff ff 7f
  57. *-2147483647 :01 00 00 80(7f ff ff ff->80 00 00 00->80 00 00 01)
  58. * 2147483648 :01 00 00 00 00(超出范围)
  59. *-2147483648 :00 00 00 80(-2147483647减去1得到)
  60. ********同理可知道short型、long型情况************
  61. *****************************************************************/
  62. return 0;
  63. }
//By Richard
#include <stdio.h>
#include <math.h>

int main()
{
	int i1=0;
	int i2=1;
	int i3=-1;
	int i4=127;
	int i5=-127;
	int i6=128;
	int i7=-128;
	int i8=255;
	int i9=-255;
	int i10=256;
	int i11=-256;
	int i12=(int)pow(2.0,16)-1;//65535
	int i13=-(int)pow(2.0,16)+1;//-65535
	int i14=(int)pow(2.0,16);//65536
	int i15=-(int)pow(2.0,16);//-65536
	int i16=(int)pow(2.0,24)-1;//16777215
	int i17=-(int)pow(2.0,24)+1;//-16777215
	int i18=(int)pow(2.0,24);//16777216
	int i19=-(int)pow(2.0,24);//-16777216
	int i20=(int)pow(2.0,31)-1;//2147483647,最大值
	int i21=-(int)pow(2.0,31)+1;//-2147483647
	int i22=(int)pow(2.0,31);//超出范围,溢出,从最小值-2147483648循环
	int i23=-(int)pow(2.0,31);//-2147483648,最小值

	/***************************************************************
	*	在return 0上打上断点,F5开始调试,Alt+6查看内存
	*	要想查看哪个变量在内存中的存储情况,在地址栏输入&+变量名,比如说:&i1
	*	int型占4个字节,注意:内存中的存储顺序和实际的字节表示刚好相反
	*	比如说:10,在内存中表示为0a 00 00 00,而实际中表示为00 00 00 0a
	*	负数的二进制数:对应的正数的二进制数每一位取反,再加1
	*	int型最高位表示符号:1,表示负数,0表示正数(内存中的最后一个字节的第一位表示)
	*	具体来分析:
	*	       0 :00 00 00 00
	*	       1 :01 00 00 00
	*	      -1 :ff ff ff ff(00 00 00 01->ff ff ff fe->ff ff ff ff)
	*	     127 :7f 00 00 00
	*	    -127 :81 ff ff ff(00 00 00 7f->ff ff ff 80->ff ff ff 81)
	*	     128 :80 00 00 00
	*	    -128 :80 ff ff ff(00 00 00 80->ff ff ff 7f->ff ff ff 80)
	*	     255 :ff 00 00 00
	*       -255 :01 ff ff ff(00 00 00 ff->ff ff ff 00->ff ff ff 01)
	*	     256 :00 01 00 00
	*       -256 :00 ff ff ff(00 00 01 00->ff ff fe ff->ff ff ff 00)
	*      65535 :ff ff 00 00
	*     -65535 :01 00 ff ff(00 00 ff ff->ff ff 00 00->ff ff 00 01)
	*      65536 :00 00 01 00
	*     -65536 :00 00 ff ff(00 01 00 00->ff fe ff ff->ff ff 00 00)
	*   16777215 :ff ff ff 00
	*  -16777215 :01 00 00 ff(00 ff ff ff->ff 00 00 00->ff 00 00 01)
	*   16777216 :00 00 00 01
	*  -16777216 :00 00 00 ff(01 00 00 00->fe ff ff ff->ff 00 00 00)
	* 2147483647 :ff ff ff 7f
	*-2147483647 :01 00 00 80(7f ff ff ff->80 00 00 00->80 00 00 01)
	* 2147483648 :01 00 00 00 00(超出范围)
	*-2147483648 :00 00 00 80(-2147483647减去1得到)	
	********同理可知道short型、long型情况************
	*****************************************************************/

	return 0;
}


二、unsigned int型存储情况
  1. //By Richard
  2. #include <stdio.h>
  3. #include <math.h>
  4. int main()
  5. {
  6. unsigned int i1=0;
  7. unsigned int i2=1;
  8. unsigned int i3=255;
  9. unsigned int i4=256;
  10. unsigned int i5=65535;
  11. unsigned int i6=65536;
  12. unsigned int i7=(unsigned int)pow(2.0,24)-1;
  13. unsigned int i8=(unsigned int)pow(2.0,24);//16777216
  14. unsigned int i9=(unsigned int)pow(2.0,31)-1;
  15. unsigned int i10=(unsigned int)pow(2.0,31);//2147483648
  16. unsigned int i11=(unsigned int)pow(2.0,32)-1;//4294967295
  17. unsigned int i12=(unsigned int)pow(2.0,32);//超出范围,这里为0
  18. /***********************************************************************
  19. * unsigned int占4个字节,只能表示正数
  20. * 最大为(int)pow(2.0,32)-1=4294967295
  21. * 当超出最大值后,从0开始往后循环
  22. * 0 :00 00 00 00
  23. * 1 :01 00 00 00
  24. * 255 :ff 00 00 00
  25. * 256 :00 01 00 00
  26. * 65535 :ff ff 00 00
  27. * 65536 :00 00 01 00
  28. * 16777215 :ff ff ff 00
  29. * 16777216 :00 00 00 01
  30. * 2147483647:ff ff ff 7f(01111111 11111111 11111111 11111111)
  31. * 2147483648:00 00 00 80(1000000 00000000 00000000 00000000)
  32. * 4294967295:ff ff ff ff
  33. ************************************************************************/
  34. return 0;
  35. }
//By Richard
#include <stdio.h>
#include <math.h>

int main()
{
	unsigned int i1=0;
	unsigned int i2=1;
	unsigned int i3=255;
	unsigned int i4=256;
	unsigned int i5=65535;
	unsigned int i6=65536;
	unsigned int i7=(unsigned int)pow(2.0,24)-1;
	unsigned int i8=(unsigned int)pow(2.0,24);//16777216
	unsigned int i9=(unsigned int)pow(2.0,31)-1;
	unsigned int i10=(unsigned int)pow(2.0,31);//2147483648
	unsigned int i11=(unsigned int)pow(2.0,32)-1;//4294967295
	unsigned int i12=(unsigned int)pow(2.0,32);//超出范围,这里为0


	/***********************************************************************
	*	unsigned  int占4个字节,只能表示正数
	*	最大为(int)pow(2.0,32)-1=4294967295
	*	当超出最大值后,从0开始往后循环
	*	  0       :00 00 00 00
	*	  1       :01 00 00 00
	*	  255     :ff 00 00 00
	*	  256     :00 01 00 00
	*	  65535   :ff ff 00 00
	*	  65536   :00 00 01 00
	*	16777215  :ff ff ff 00
	*	16777216  :00 00 00 01
	*	2147483647:ff ff ff 7f(01111111 11111111 11111111 11111111)
	*	2147483648:00 00 00 80(1000000 00000000 00000000 00000000)
	*	4294967295:ff ff ff ff
	************************************************************************/
	return 0;
}

三、char和unsigned char型讨论

  1. //By Richard
  2. #include <stdio.h>
  3. int main()
  4. {
  5. char c0=0;//00
  6. char c1=1;//01
  7. char c2=-1;//ff(01->fe->ff)
  8. char c3='A';//41
  9. char c4=65;//41
  10. char c5=127;//7f
  11. char c6=-127;//81(7f->80->81)
  12. char c7=128;//超出范围
  13. char c8=-128;//80
  14. unsigned char uc0=0;
  15. unsigned char uc1='A';//41
  16. unsigned char uc2=65;//41
  17. unsigned char uc3=127;//7f
  18. unsigned char uc4=128;//80
  19. unsigned char uc5=255;//ff
  20. unsigned char uc6=256;//超出范围,从0开始循环
  21. /********************************************
  22. * char范围为-128到127,表示的ASCII码有限
  23. * unsigned char范围为0到255,能表示所有的ASCII码
  24. * 在牵扯到读取文件或写文件,都定义成unsigned char型
  25. *********************************************/
  26. return 0;
  27. }
//By Richard
#include <stdio.h>

int main()
{
	char c0=0;//00
	char c1=1;//01
	char c2=-1;//ff(01->fe->ff)
	char c3='A';//41	
	char c4=65;//41
	char c5=127;//7f
	char c6=-127;//81(7f->80->81)
	char c7=128;//超出范围
	char c8=-128;//80

	unsigned char uc0=0;
	unsigned char uc1='A';//41
	unsigned char uc2=65;//41
	unsigned char uc3=127;//7f
	unsigned char uc4=128;//80
	unsigned char uc5=255;//ff
	unsigned char uc6=256;//超出范围,从0开始循环
	
	/********************************************
	* char范围为-128到127,表示的ASCII码有限
	* unsigned char范围为0到255,能表示所有的ASCII码
	* 在牵扯到读取文件或写文件,都定义成unsigned char型
	*********************************************/
	return 0;
}


四、float型讨论

  1. //By Richard
  2. #include <stdio.h>
  3. int main()
  4. {
  5. //float占4个字节
  6. float d0=0;
  7. float d1=1;
  8. float d2=-1;
  9. float d3=1.5;
  10. float d4=-1.5;
  11. float d5=11.9;
  12. float d6=0.2356;
  13. /*********************************************************************
  14. * 0:00 00 00 00
  15. * 1:00 00 80 3f
  16. * -1:00 00 80 bf
  17. * 1.5:00 00 c0 3f
  18. *-1.5:00 00 c0 bf
  19. *详细过程:
  20. *============================================================
  21. *4字节: 31 30 29-23(7位) 22-0(23位)
  22. * 表示:实数符号位 指数符号位 指数位 有效数位
  23. *=============================================================
  24. * 将一个float型转化为内存存储格式的步骤为:
  25. * 1,先将这个实数的绝对值化为二进制格式
  26. * 2,将这个二进制格式实数的小数点左移或右移n位,直至小数点移动到第一个
  27. * 有效数字的右边
  28. * 3,从小数点右边第一位开始数出23位,放入第22位到第0位
  29. * 4,如果实数是正的,则在第31位放入“0”,否则放入“1”
  30. * 5,如果n是左移得到的,说明指数是正的,第30位放入“1”。如果是右移得到的或
  31. * n=0,则第30位为“0”
  32. * 6,如果n是左移得到的,则将n减去1后化为二进制,并在左边加0补足7位,放入
  33. * 第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加0补足7位
  34. * 再各位取反,之后放入第29到第23位
  35. *=============================================================
  36. * 举例说明: 11.9的内存存储格式
  37. * (1) 将11.9化为二进制后大约是" 1011. 1110011001100110011001100..."。
  38. * (2) 将小数点左移三位到第一个有效位右侧: "1. 011 11100110011001100110 "。
  39. * 保证有效位数24位,右侧多余的截取(误差在这里产生了 )。
  40. * (3) 这已经有了二十四位有效数字,将最左边一位“1”去掉,得到
  41. * “ 011 11100110011001100110 ”共23bit。将它放入float存储结构的第22到第0位。
  42. * (4) 因为11.9是正数,因此在第31位实数符号位放入“0”。
  43. * (5) 由于我们把小数点左移,因此在第30位指数符号位放入“1”。
  44. * (6) 因为我们是把小数点左移3位,因此将3减去1得2,化为二进制,并补足7位得到0000010,
  45. * 放入第29到第23位。
  46. * 最后表示11.9为:|0 1 [00|0001|0] [011 |1110|0110|0110|0110|0110]
  47. * 对应的16进制为: 4 1 3 e 6 6 6 6
  48. * 内存存储为:66 66 3e 41
  49. *================================================================
  50. * 再举一个例子:0.2356的内存存储格式
  51. *(1)将0.2356化为二进制后大约是0.00111100010100000100100000。
  52. *(2)将小数点右移三位得到1.11100010100000100100000。
  53. *(3)从小数点右边数出二十三位有效数字,即11100010100000100100000放
  54. * 入第22到第0位。
  55. *(4)由于0.2356是正的,所以在第31位放入“0”。
  56. *(5)由于我们把小数点右移了,所以在第30位放入“0”。
  57. *(6)因为小数点被右移了3位,所以将3化为二进制,在左边补“0”补足七
  58. * 位,得到0000011,各位取反,得到1111100,放入第29到第23位。
  59. * 最后表示0.2356:0 0 [11|1110|0] [111|0001|0100|0001|0010|0000]
  60. * 对应的16进制为: 3 e 7 1 4 1 2 0
  61. * 内存存储为:20 41 71 3e
  62. ************************************************************************/
  63. return 0;
  64. }
//By Richard
#include <stdio.h>

int main()
{
	//float占4个字节
	float d0=0;
	float d1=1;
	float d2=-1;
	float d3=1.5;
	float d4=-1.5;
	float d5=11.9;
	float d6=0.2356;

	/*********************************************************************
	*   0:00 00 00 00
	*   1:00 00 80 3f
	*  -1:00 00 80 bf
	* 1.5:00 00 c0 3f
	*-1.5:00 00 c0 bf
	*详细过程:
	*============================================================
	*4字节:    31          30      29-23(7位) 22-0(23位)
	* 表示:实数符号位  指数符号位   指数位        有效数位
	*=============================================================
	* 将一个float型转化为内存存储格式的步骤为:
	* 1,先将这个实数的绝对值化为二进制格式
	* 2,将这个二进制格式实数的小数点左移或右移n位,直至小数点移动到第一个
	*    有效数字的右边
	* 3,从小数点右边第一位开始数出23位,放入第22位到第0位
	* 4,如果实数是正的,则在第31位放入“0”,否则放入“1”
	* 5,如果n是左移得到的,说明指数是正的,第30位放入“1”。如果是右移得到的或
	*    n=0,则第30位为“0”
	* 6,如果n是左移得到的,则将n减去1后化为二进制,并在左边加0补足7位,放入
	*    第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加0补足7位
	*    再各位取反,之后放入第29到第23位
	*=============================================================
	* 举例说明: 11.9的内存存储格式 
	* (1) 将11.9化为二进制后大约是" 1011. 1110011001100110011001100..."。 
	* (2) 将小数点左移三位到第一个有效位右侧: "1. 011 11100110011001100110 "。 
	*     保证有效位数24位,右侧多余的截取(误差在这里产生了  )。 
	* (3) 这已经有了二十四位有效数字,将最左边一位“1”去掉,得到
	*     “ 011 11100110011001100110 ”共23bit。将它放入float存储结构的第22到第0位。 
	* (4) 因为11.9是正数,因此在第31位实数符号位放入“0”。 
	* (5) 由于我们把小数点左移,因此在第30位指数符号位放入“1”。 
	* (6) 因为我们是把小数点左移3位,因此将3减去1得2,化为二进制,并补足7位得到0000010,
	*     放入第29到第23位。 
	* 最后表示11.9为:|0  1  [00|0001|0] [011 |1110|0110|0110|0110|0110]
	* 对应的16进制为:   4       1     3      e    6    6   6    6
	* 内存存储为:66 66 3e 41
	*================================================================
	* 再举一个例子:0.2356的内存存储格式
	*(1)将0.2356化为二进制后大约是0.00111100010100000100100000。 
	*(2)将小数点右移三位得到1.11100010100000100100000。 
	*(3)从小数点右边数出二十三位有效数字,即11100010100000100100000放
	*     入第22到第0位。 
	*(4)由于0.2356是正的,所以在第31位放入“0”。 
	*(5)由于我们把小数点右移了,所以在第30位放入“0”。 
	*(6)因为小数点被右移了3位,所以将3化为二进制,在左边补“0”补足七
	*     位,得到0000011,各位取反,得到1111100,放入第29到第23位。 
	*  最后表示0.2356:0 0 [11|1110|0] [111|0001|0100|0001|0010|0000]
	*  对应的16进制为:   3      e     7      1    4    1    2    0
	*  内存存储为:20 41 71 3e
	************************************************************************/
	return 0;
}


五、double型讨论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值