数据类型转换一定会产生符号扩展吗?
2023-04-01 17:41 作者:yidadakimasi | 我要投稿
这里面有两个基础概念,第一个是强制类型转换,第二个是符号扩展。
为什么要有类型转换?
因为编译器不能处理不同类型之间的运算。要么是两个整数运算,要么是两个浮点数运算,总之类型必须是一样的。如果是一个整数和一个浮点数运算,那么要么把整数转换位浮点数,要么把浮点数转换位整数。
类型转换是啥样子的?显著特征就是赋值符号左右的两个数据类型不一致
int a='m';
int b=(char)a;
什么是符号扩展,为什么要有符号扩展这件事情?
符号扩展就是把小存储空间中的数据放到大存储空间的时候,需要把大存储空间多余的部分填充数据,填充什么呢? 就填充数据的符号位。
假设1100这是一个有符号的四位二进制位,符号位是1,转换成八位二进制就是1111 1100
假设0011这是一个有符号的四位二进制位,符号位是0,转换成八位二进制就是0000 0011
那么,为什么要有符号扩展这个东西呢? 符号扩展发生在数据类型转换的时候,即,只要你看到 类似int b=(char)a; 这种转换类型的时候就可能发生。类型转换,我们是希望转换前后的数据是相同的,如果不相同就不叫转换了,叫改变。
抓换前是1100,转换后是1111 1100 这两个代表的真值是一样的。
转换前是0011,转换后是0000 0011 这两个代表的真值也是一样的。
回到我们的问题,数据类型转换一定会产生符号扩展吗?
不一定的。比如把unsigned int 转换为int 或者把int 转换为unsigned int 都不会发生符号扩展,因为这两种数据类型占用的空间是一样的,只需要按照各自的格式读写数据就可以完成转换。

