C/C++基本类型内存表示


我们都知道,C/C++这种高级编程语言,在编译执行的时候,最底层都是二进制的数据,即0/1组合。那么我们来看一下具体是怎么 表示的:

首先,常用的基本类型占用的字节数:

bool  1byte(BOOL 4bytes ,其实际上是int型)

char 1byte

short 2

int   2~4不等,视操作系统而定,一般是4bytes

long 4 

long long 8(个别操作系统会出现10等)

float 4

double 8

接着,将byte继续往下看。可以化为 bit ,一个byte = 8bit

1.bool 通常是1 byte,bool取值false和true,是0和1的区别; false可以代表0,但true有很多种,并非只有1。

  如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器


2.char 1byte,即8bit,可以用一个8位的二进制数表示。例如字符‘A’,存在内存中并非如此,而至转换为一个二进制数,A貌似是65,即在内存中就是占8位bit,数值就是65的二进制表示形式。

3.short  占16bit位,如果将其化为有符号的和无符号数可分为两种 :unsigned short i; i可以表示0~65535   signed(默认)short i; i可以表示-32768~+32767(将第一bit位作为符号位,0表示正数,1表示复数)

在类型转换的时候,如果将4byte的int强制转换为2byte的short,则会出现内存截断,取其低位。

若是short转int,则会用short的2byte填补int的低位,若是出现复数,则会用符号填补高位。

4.float 4bytes,32bit。第一位为符号位,后面8位是无符号数,后面23位分别表示2的-1次幂到-23次幂,用来表示小数。

浮点数表示方法为(-1)s次幂(s为第一bit的数)乘以1.XXXX乘以2的(exp-127)次幂,exp是中间8bit表示的无符号数。所以浮点型数据表示的范围是3.4e + / - 38

如果

int i = 5;
float f = i;
cout<<f<<endl;


输出的还是5,只不过表示形式不一样了。转换为上述的公式形式。

int i = 37;
float f = *(float*)&i;
cout<<f<<endl;


输出的数不会是37,应该是个小数,但不确定是什么。

	int i1 = 8390663;//2的23次幂 + 2的11次幂 + 7
	short s1 = i1;
	cout<<s1<<endl;
	//发生内存截断,只保留了低位,输出2055,即2的11次幂 + 7

	short s2 = -1;
	int i2 = s2;
	cout<<s2<<endl;

	int i3 = 5;
	float f3 = i3;
	cout<<f3<<endl;

	int i4 = 37;
	float f4 = *(float*)&i4;
	cout<<f4<<endl;
	//内存转换了,应该在2的-20次幂左右,极小的数

	float f5 = 7;
	short s5 = *(short*)&f5;
	cout<<s5<<endl;
	//利用指针获取地址的方式取到了高位,输出0


  一个小实例,大家有兴趣的可以试一下,也可以自己写一些有趣的例子,大家一起共享一下!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值