欢迎光临散文网 会员登陆 & 注册

数据类型转换一定会产生符号扩展吗?

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 都不会发生符号扩展,因为这两种数据类型占用的空间是一样的,只需要按照各自的格式读写数据就可以完成转换。




数据类型转换一定会产生符号扩展吗?的评论 (共 条)

分享到微博请遵守国家法律