C/C++, 类型转换 发生了什么?C语言中,数据类型间的转换,主要体现在内存间的转换,或者可以说体现在 bit 的
C/C++, 类型转换 发生了什么?
C语言中,数据类型间的转换,主要体现在内存间的转换,或者可以说体现在 bit 的转换,数据类型在内存的中都是以 bit 的形式体现的。
C/C++char 1 byteshort 2 bytesint 4 byteslong 4 bytesfloat 4 bytes double 8 bytes
来看几个简单的例子,就会明白数据类型在转换的时候究竟发生了什么。
char ch ='A';short s = ch;printf("%d",s);在console中的结果是 65。
int i = pow(2,23)+pow(2,21)+pow(2,14)+7;//2^23+2^21+2^14+7short s = i;printf("%d",s);
结果一定是 short s = 2^14+7.
上面之所以写成2的指数的形式,是为了方便书写2进制,来看下 int i 的存储形式
short s = -1;int i = s;printf("%d",i);
variable short s的存储形式 为
# include <stdio.h>int main(void){unsigned char uc1 = 0x256;unsigned char uc2 = 12;printf("%d %d | %x %x\n",uc1,uc2,uc1,uc2);return 0;}
16进制与2进制的相互转化一定要熟悉掌握
0x256
现转化2 -> 0010;
5 -> 0101;
6 -> 0110;
所以0x256 的 二进制形式为 0010 0101 0110。
由上面说到的 bit pattern copy 可以知道
unsigned char uc1 = 0x256. 只能将低8位 copy 到 char uc1的8位存储空间中。
所有 char uc1 01010110
然后转化为 10进制 就为 2^1+2^2+2^4+2^6 = 86; %d(10进制) uc1 = 86;
%x,是指 去掉0x的16进制数, uc1 = 86; 由10进制转化为16进制,以2进制为桥梁,
86 的二进制为0101 0110
然后每四个bit一组 分别转化16进制 0101 -> 2^0+2^2 = 5;
0110 -> 2^1+2^2 = 6;
所以86的16进制为 56。 %x uc1 = 56;
同理可得出 %d uc2 = 12; %x uc2 = C。
本文主要介绍了 在C/C++ 类型转化时发生了什么? int short char间的转化。
那么float double与 int或者 short 发生转化时又是怎样的?以及float double在内存中又是怎么存储的?
未完-待续。