程序猿之---C语言细节16(看了绝对值,编译类型ANSI C和K&R C类型判断,c编译器类型转换bug的细节)

主要内容:编译类型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;
}

输出:



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。