C系基本类型数值转换

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中基本不对越界进行任何检查。只要你给出一个类型,一个首地址,它便按照该类型对地址依次后面的数据进行解释,以及确认对该指针的基本操作(+,-)。所以只要画出内存,就能够迎刃而解了。当然还要结合具体操作系统的一些大端和小端的表示方法

你可能感兴趣的:(C系基本类型数值转换)