我们在日常的数据利用中常常会遇到数据类型的转换
这时我们就要对数据变化有一定的了解:
数据变 化的几种类型:
1.符号变化 |
2.整形提升 |
3.数据截断 |
符号变化:
无符号数据与有符号数据的转化:有符号数据的最高位为符号位,1表示该数为负数,0表示该数为为正数。当我们把有符号数据转化为无符号数据类型时,有符号数据的符号位会转化为进行计算的数据。
就好比:-1,转化为无符号数据时我们会得到一个很大的数:
int main()
{
int a = -1 ;
size_t p = (size_t)a;
printf("%zu\n", p);
return 0;
}
-1的补码>>11111111111111111111111111111111,>>最高位表示符号位。转化为无符号数时最高位参与计算:
总结:有无符号的转化,主要看补码的计算。
整形提升:
当低内存数据转化为高内存数据时,就要考虑数据的内存是如何提升的问题,也就是整形提升。
这里我们定义一个char类型的数据,将其分别转化为int类型和size_t类型。
有符号数据整形提升:
int main()
{
char i =-1 ;
int m = (int)i;
char n = 1;
int y = (int)n;
printf("%d %d\n", m,y);
return 0;
}
这里我们查询m在内存中的存储数据
其在内存中储存的数据16进制为ff ff ff ff,2进制为11111111 11111111 11111111 11111111
也就是更高的位补一,那y的储存数据为:
其在内存中的存储数据为00 00 00 01,(我这是小端的储存方式),也就是高位补0。
总结:有符号整形提升高位补符号位
无符号数据整形提升:
int main()
{
size_t i = 1;
long int m=(long int)i;
return 0;
}
这里我们的无符号数没有符号为,在进行整形提升时,高位补0;
数据截断:
当高内存数据转化为低内存数据时我们就截断一部分高内存数据的空间。我们的数据储存在内存空间中,那么我们是截取高位地址的数据还是低位地址的数据呢?
我们可以看到截取的数据为01;
那么我们也可以看到1的存储类型为01 00 00 00,我们截取了低地址的数据(在小端机器)。
其实数据截取,截取的就是从最低2进制位开始向高位截取。
到这里也结束了,那么留下一个问题
int main()
{
char n = 300;
printf("%d", n);
return 0;
}
该代码运行结果是什么。