今天在研究字符编码的时候偶然想到一个问题,在ansi编码中,一个中文字符是用两个字节表示的,但是一个char是一个字节,那么如果我将一个中文字符赋值给一个char变量的话,打印输出会发生什么情况呢?
试了一下,发现乱码,意料之中,显然计算机还是把这个中文字符拆成了两半,把其中的一般赋值给了变量a,那么赋给它的到底是哪一半呢?
试一下便知道了,中文字符‘你’的十六进制编码是C4 E3,那么按照下面程序输出结果为:
char a = '你';
cout<<(int)a;
输出结果为-29,计算E3的结果和该结果相同,那么我们推测选取的是后一半。再用‘我’进行验证。C4 D2,结果为-46,猜想正确。
其实在上面的程序中发生了两次转换,第一次是把你这个字符拆成两半,把后一半赋值给a,第二次由于a是一个字节而int是四个字节,那么需要在a前面补零以达到四个字节的长度。
那么如果将int赋值给char变量,截取的是不是也是后一段呢?由下面的程序可以看出:
int b = 7898;
char c = b;
cout<<(int)c;
程序结果为-38,而7898的二进制编码为1111011011010,研究其后八位,发现其结果一致,所以计算机截图的还是后面八位,而不是前面的八位。
所以我们现在便可以想到,计算机在截取的时候总是在后面截取而不是在前面截取。
但是在计算机中浮点数的表示却有点复杂,那么计算机在由浮点数转换为其他类型时也是不一样的。例如由浮点数转换为int整数,那么计算机截取的是整数部分,而不是后32位。那么浮点数转换为char型的呢?
double aa = 3000.9;
char te = aa;
cout<<endl<<(int)te;
结果为-72,刚好为3000的二进制表示结果,经过多次验证,发现其实浮点数转换为char型是先转换为int型,再由int型转换为char型的。
更多类型转换,请继续关注本博客。