首页 > 代码库 > C++:For循环的无符号条件判断问题

C++:For循环的无符号条件判断问题

有个奇怪的C语言问题:
 

unsigned char t=0;  unsigned char i=0;  for(i=0; i <(t -1); i++)  {      printf("i=%u\n",i);      if(i > 100)      break;  }

 

 

这样循环一次也不执行,但是若把代码中的char都改成int,就会循环很多次.
因为若t为unsigned
char(u8)时,1为int型,t-1会都转换成int类型的运算,为-1.i为u8类型,与int比较时候会转换成int,因此0<-1,循环不会执行.

若t为unsigned
int(u32)时,1为int型,t-1会都转换成u32类型的运算,为一个很大的值.i也是u32类型,因此0<4294967295,循环会执行非常多次.

后来在C++
primer书上找到关于类型转换的:
最简单的转换为整型提升:对于所有比int型小的整型,包括char,signed char,unsigned
char,short和unsigned short,如果该类型的所有可能的值都能包括在int内,它们会被提升为int型,否则它们将被提升为unsigned
int型.如果将bool值提升为int,则false转换为0,而true则转换为1.
对于包含signed和unsigned
int型的表达式,其转换可能出乎我们的意料.表达式中的signed型数值会被转换为unsigned型.

转载自:http://blog.sina.com.cn/s/blog_4a24ee3e01016m8a.html

 

C++:For循环的无符号条件判断问题