前言
- 在C语言中,整数的赋值是机器数的赋值,而不是真值的复制
- 而我们printf出的真值是经过编译器把机器数翻译出来的结果,这个翻译的过程与我们定义变量时指定的数据类型有关系
- 这篇文章中我们的研究对象是C语言中的赋值语句
b=a;
- 但是b与a的数据类型可能相同也可能不同,那么就会产生截断或者扩展或者编码转换等的问题
一、整数与整数
我们知道C语言中的整数有很多种
按照是否带符号分为:有带符号整数和无符号整数
按照长度有:short int long
这样一组和的话就是说整数有2*3=6种类型
在这个实验中我们关心的就是:在赋值的时候,如何从一种类型到另一种类型
1.宽度相同
比如int->int short->short long->long
考察赋值语句b=a;
b与a的机器数相同,但是真值不一定相同
int x=-1234;
unsinged int y=x;
2.长的数据类型赋值给短的数据类型 – 发生截断
int x=0x12345678;
short y=x;
运行结果
3.短的数据类型赋值个长的数据类型 – 发生扩展
如果是带符号整数发生符号扩展
否则发生0扩展
二、整数和浮点数转化
1.整数 ⇒ 浮点数
整数真值以补码形式的机器数存储
补码转换成float编码 按照IEEE754标准分段找到符号位、尾数、阶码部分
转换过程可能会有精度的损失
2.浮点数 ⇒ 整数
float编码转换成补码,可能会产生溢出