再谈c++类型转换

今天在研究字符编码的时候偶然想到一个问题,在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型的。


更多类型转换,请继续关注本博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值