C 语言基本类型在内存中的表示
C/C++不外乎以下几种基本类型:bool,char,short,int,long,float,double,还有不常用的 long long。
char 占用一个字节,而 short 占用两个字节,在 char 转化为 short 时,全部复制到 short 占用内存的低八位里面。
#include <iostream>
int main()
{
char ch = 'A';
short s = ch;
std::cout << s << std::endl;
return 0;
}
反之,short 转化为 char 时,把高位的一个字节直接扔掉,只复制低字节。
int 一般占用 4 个字节,和 short 转化和上面 char 和 short 转化类似。下面看一个不太一样的例子。
i 在内存中的表示是 0000 0000, 0000 0000, 1000 0000, 0000 0000。short 占用两个字节,直接把低位两个字节复制过来,s 在内存中的表示是 1000 0000, 0000 0000。第一位是符号位,表示负数,根据补码表示的意义,输出应该是负 2 的 15 次方,即 -32768。
float 也占用四个字节,但是每一位的含义不一样,第一位是符号位 s,接着的八位是 exp,接着 23 位是尾数,表示 0.ddd,float 的值等于 。
正常的 int 转 float 很简单,比如:
i 和 f 占用的内存对应的 bit 位上 0/1 差别很大。
来看个不正常的转化
i 在内存中的表示是 0100 0000, 0100 0000, 0000 0000, 0000 0000。f 的赋值使用了 i 的内存,以 float 的方式去读。符号位是 0,表示正数,exp 是 1000 0000,也就是128,再后面是一个 1,22 个 0,尾数就是 1.1。所以 f 等于 ,即输出 3。注意,这个等式第一步把二进制变成了十进制。