程序猿之---C语言细节16(看了绝对值,编译类型ANSI C和K&R C类型判断,c编译器类型转换bug的细节)
2014-11-11 16:58
411 查看
主要内容:编译类型ANSI C和K&R C类型判断,c编译器bug的细节
输出:
#include <stdio.h> int main() { // 例子1 :编译器类型判断 /* * K&R采用无符号保留原则,即当一个无符号类型与ing 或更小的整型混合使用时,结果类型为无符号 * ANSI C采用值保留原则, 即当把几个整数操作数像下面这样混合使用时,结果类型可能为有符号也可能为无符号 * ,结果取决于操作数的类型的相对大小 */ if(-1 < (unsigned char)1) // 我使用编译器是ANSI C, 当写成if(-1 < (unsigned int)1)时,-1就被转换成巨大的正数, //而当前表达式却不转换,印证了ANSI C值保留原则 printf("-1 is less than (unsigned char)1 : ANSI semantics\n"); else printf("-1 NOT less than (unsigned char)1: K&R semantics\n"); /**************************************************** * 例子2 :错误例子说明 * ****************************************************/ int array[] = {1,2,3,4,5,6,7}; #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) /*使用array[0]而不是array[int],可以不改变#define语句的情况下改变array数组的类型(如把int变成char)*/ int d = -1, x; /*(d = -1) <= (7-2 =5) 按理是要打印下面语句 *但是 TOTAL_ELEMENTS返回的是unsigned int类型(因为sizeof()返回 *的类型是无符号数),if语句在signed int和unsigned int之间测试相等性时, *把d的类型提升为unsigned int类型,-1转换为unsigned int 为很大的正整数, *这个bug在ANSI C中存在,在K&R C中sizeof也是返回无符号,要修正这个问题,只要对 TOTAL_ELEMENTS进行强制类型转换即可 *加上if (d <= (int)TOTAL_ELEMENTS-2) */ if(d <= TOTAL_ELEMENTS-2) { x = array[d+1]; printf("x = %d\n",x); } /* 小启发: 1、尽量不要在你的代码中使用无符号类型,尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债)而用它表示数量 2、尽量使用像int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心便捷情况(如-1转换成了非常大的正数) 3、只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为无符号或有符号, 这样就不必有编译器来选择结果的类型,在第一个例子说明了 */ return 0; }
输出:
相关文章推荐
- 程序猿之---C语言细节9(宏定义、max(a,b)宏定义细节、大小端判断、(int&)a什么意思)
- ANSI C 前值类型转换bug
- C语言的标准(K&R C,ANSI C,C89,C90,C99)
- 深刻理解C语言中的*和&、类型转换
- 如何在编译时刻判断两个类型是否可以自动转换?——《Modern C++ Design》读书笔记(1)
- 程序猿之---C语言细节24(段错误、类型提升、sizeof 'A')
- 程序员之---C语言细节24(段错误、类型提升、sizeof 'A')
- 程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)
- C++中各种类型转换的具体细节<未完成>
- 程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)
- C语言在函数名与函数体之间定义变量--K&r C和ANSI C两种风格的函数声明和定义
- C语言中byte类型与int类型转换与移位小细节记录
- 从一个程序的Bug解析C语言的类型转换(转自:http://www.cnblogs.com/dolphin0520/archive/2011/10/15/2212834.html)
- C语言的编译器类型的判断(34)
- 从一个程序的Bug解析C语言的类型转换
- 我的JavaScript回顾之路_01—0206—++在前在后区别/&&和||/条件判断语句/循环语句的区别/字符串类型数字和数字类型之间的转换
- 类型强制转换 And 判断DataRow非空…
- 程序猿之---C语言细节25(数据类型取值范围、char细节、浮点数细节)
- 程序猿之---C语言细节6(数组参数、数组越界、编译器内存分配)
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。