1.相同类型有符号和无符号数之间转换(int<->unsiged int):
这种转换只涉及位的解释 也就是说位模式是不变的 只是最高位是否解释为符号位的问题
eg: int i = -1; unsigned int ui = i; 此时ui=4294967295
2.短类型赋给长类型(eg: short->int)
将short的所有位放在int的低位两个字节里, 对于高位 有符号展和0扩展两种方式 具体跟踪short有无符号而定
eg: short s = -1; int i = s; unsigned int ui = -i; 此时i=-1; ui = 429496295 (符号扩展)
unsigned short = (unsigned short)-1; int i = s; 此时i=65535 (0扩展)
3.长类型赋给短类型(eg:int->short)
将int的低位两个字节赋给short
eg:int i = -1; short s = (short)i; unsigned short us = (unsigned short)i; 得到s=-1; us=65535;
注意: 上面2,3点说到的低位是相对于小端法表示的机器的。对于大端法机器来说,它是转移的高位。更形象的说法类似于类型转换:长类型赋给短类型是将长类型低地址开始的k个字节赋给长短为k的短类型 反之亦然,系统从低地址开始按照拷贝 然后解释
4.涉及到浮点数与整型转换时,与上述方案不同的是,操作系统会先算出浮点数值,再将其向0靠拢的方式化为整 数, 再填充到该整数的地址处。跟踪可以发现其实操作系统调用了一个内置函数_ftol来实现的
eg:float f = 9.5; int i = f; 得到i=9;
float f = -9.5; int i = f; 得到i=-9;
整数到浮点数也是一样的道理。
5.其他类型(结构体,数组等)
对于这些类型只需要对它们在内存中的摆放熟悉(包括一些基本的对齐方式)。时刻牢记在C中基本不对越界进行任何检查。只要你给出一个类型,一个首地址,它便按照该类型对地址依次后面的数据进行解释,以及确认对该指针的基本操作(+,-)。所以只要画出内存,就能够迎刃而解了。当然还要结合具体操作系统的一些大端和小端的表示方法