char和unsigned char字符类型

本文最新链接地址为: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;
 }
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值