Cpp_Basic---12/N(类型转换)

2017-01-07 10:38:29来源:oschina作者:OSer_Merlin人点击

第七城市

一些思考和总结.


修订历史:

初稿(1.自动类型转换; 2. 强制类型转换)-----2017/1/6

参考资料:



自动类型转换

表达式中, "类型兼容"的基本类型, 在运算之前(运算数类型不一致), 系统会进行自动类型转换, 一般包括两大类:

赋值类型转换
算数混合运算 算数混合运算

先说简单的, 算数混合运算, 规则如下:


横向: 有符号--->无符号 (例如 char---> unsigned char, int ---> unsigned int)


纵向 :char(Ascii码)/short --> int --->long---> float ---> double --->long double.

规则我都懒得解释, 总记得: 往表示范围大的或者精度大的类型转换, 相同之后, 再开始运算.


(先转换, 后运算)

赋值类型转换

(赋值号左右两边儿的类型不一致时, 系统将自动进行转换)


由于signed和unsigned对于符号位的解释不同, 所以最好不要让两者相互转换.除非你对所在OS或者平台的转换规则非常熟悉, 确保不会出错(超出范围&溢出).


其中字符型和整形之间的转换比较特殊: (字符型赋值给整型)

对无符号字符数据, 低位字节不变, 高位字节补0.
对有符号字符数据, 若符号位为0, 与无符号字符数据转换规则相同;若符号位为1,则低位字节不变,高位字节全部置1.

举个例子:


#include
using namespace std;int main(void){


cout << sizeof(signed char)<< endl; //1 bytes -2^7 ~2^7-1
cout << sizeof(unsigned char) << endl;//1 bytes 0~2^8-1
cout << sizeof(unsigned short) << endl; //2 bytes 0~2^16-1 (65535)


signed char c = 250; // beyond 127
signed short int a = c; //a补码是11111111 11111010

cout << a << endl;//-6: 原码是10000000 00000110

return 0;
}

最后强调一下: unsinged和signed的, 别乱转换; 字符类型转换给整型注意一下规则.


强制类型转换

强制类型转换, 分为C风格和C++风格, 其中C++风格相对安全(其实只要是强制类型转换, 多数时候不能100%保证安全), 但是无论哪种风格, 只要是强制类型转换, 其实都是对表达式进行类型转换(因为表达式具有类型和值两个特性), 并且, 不改变表达式本身的类型和值, 只是产生临时变量来暂存转换后的类型和值.

C风格

C风格的强制类型转换, 就一种形式:


(type)

简单的用法: (体会一下就好了, 注意括号的优先级比较大)


int a =1, b=2;
float c1 = a/b;
float c2 = (float)a/b;
float c3 = (float)(a/b);

(像按类型内存对齐分配内存, 或者高效分配内存, 或者容器capacity扩展时, 可能用到)

C++风格

对C那种简单粗暴的方式, 进行了更细致, 严谨的划分.


根据C++03的语法, 基本上就这4个: (用法比较固定)

static_cast
const_cast
dynamic_cast
reinterpret_cast

下面都是啰嗦的话:


强制类型转换, 不管是哪一种, 都不推荐, 就像运算符优先级和线程控制一样, 强制类型转换也会藏有很多不可知的bug, 故而, 在能够用设计方法解决的问题, 最好不要用强制类型转换.

先这样, 有问题再说.


merlin


2017/1/6

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台