##关于C中的类型转换程序员
对于C中的类型转换一直停留在《C和指针》中的那张类型提高表中,其中给出了类型的提高顺序,也就是说若是一个表达式中同时出现了int和short,short类型的变量会自动提高为int。可是对其中的具体原因,历来没有去详细的想过,以前看书比较粗糙,没有细读一本书,理解了总体的意思就以为本身真的理解的做者的意图,最近在[coursera]上看《[史记]》的开放课程的时候老师讲到一个看怎样读经书的方法,讲到一篇经典的文章的时候,都会去揣测每个字的含义,以及为何要用这个字而且出如今这个位置。而后本身去翻了一下前人写的那些个注疏,发现好多的经典咱们都没有真正的理解其中的含义。指针
言归正传,继续写个人读书笔记,当一个无符号类型的值从较小的数据类型转换为一个较大的数据类型的时候,高位补零就能够了,这里也叫做零扩展(zero extersion)。若是将一个有符号的值从较小类型转换成较大的类型的时候会发生什么的?难道也是同样的吗?非也,这里的概念我也是第一次看到,这里会发生符号扩展(sign extension),也就是说高位补什么是根据他的最高位决定的。code
##关于类型转换的一些建议ci
关于类型转我以为C++之父的那句话永远是真理,C风格的隐时类型转换正的很邪恶,常常会发生一些和你的直觉不相符的事情。这也就是C程序员永远要考虑的一个问题。下面就是一段很邪恶的代码。element
3 float sum_elements(float a[], unsigned int length) 4 { 5 float sum = 0.0; 6 7 int i; 8 for(i = 0; i < length-1; i++) 9 sum += a[i]; 10 11 return sum; 12 }
我使用以下的调用会get
17 float s[] = {1,2,3,4}; 18 float result = sum_elements(s, 4); 22 result = sum_elements(s, 0);
你猜会发生什么?io
qian@qian-vm:~/excise/csap/ch2$ ./a.out <br> result of sum is 6.000000<br> Segmentation fault (core dumped)class
-END [coursera]:http://coursera.org/ "coursera" [史记]:https://class.coursera.org/shiji-002 "史记"读书笔记