本文最新链接地址为:http://lifepeak.net/it-jishu/char-range.html
本文对char字符类型的范围和unsigned char字符类型范围进行简单的分析,希望对大家的工作和学习有所帮助
首先给出一个题目:请打印出从65~127(10进制表示)的ASCII字符,并且每8个就转到下一行显示。这里先给出如下实现:
#include <stdio.h>
int main()
{
char ch;
for (ch = 65;ch<=127; ch++)
{
printf("%c", ch);
if (ch%8 == 0) /*(ch-64)%8等效于ch%8*/
printf("/n");
}
return 0;
}
大家认为以上程序有什么问题吗,当然有问题,此程序会造成死循环。因为char的范围是-128~127,127+1就会变为-128,所以ch永远会小于127,造成死循环。-128在计算机中表示为补码,其补码为10000000B(0x80)。(大家是不是快忘了补码,原码,反码相关知识了,这里简单讲一下:
正数只有原码,其原码就是其二进制表示,正数在计算机中即是以其原码形式存储的,负数有原码和补码,负数在计算机中是以其补码形式存储的)
把程序修改为
int main()
{
char ch;
for (ch = 65;ch!=0x80; ch++)
{
printf("%c", ch);
if (ch%8 == 0) /*(ch-65+1)%8等效于ch%8*/
printf("/n");
}
return 0;
}
还是会进入死循环,问题是语句ch!=0x80, 0x80首先会转换为正数(+128)。
如果语句是ch=0x80,则0x80提升为char类型此时ch = -128。
程序最终的正确改法有如下3种
一
int main()
{
char ch;
for (ch = 65;ch!=-128; ch++)
{
printf("%c", ch);
if (ch%8 == 0) /*(ch-65+1)%8等效于ch%8*/
printf("/n");
}
return 0;
}
二
int main()
{
char ch;
for (ch = 65;ch<=127&&ch>0; ch++)
{
printf("%c", ch);
if (ch%8 == 0) /*(ch-65+1)%8等效于ch%8*/
printf("/n");
return 0;
}
}
三
或者换成unsigned char类型,其范围为0~255
int main()
{
unsigned char ch;
for (ch = 65;ch<=127; ch++)
{
printf("%c", ch);
if (ch%8 == 0) /*(ch-65+1)%8等效于ch%8*/
printf("/n");
return 0;
}
}