在没有unsigned char的情况下在C中显示ASCII字符

时间:2015-06-13 14:25:03

标签: c visual-studio-2013 infinite-loop

unsigned char a;

for(a=32;a<128;a=a+1)
printf("%d='%c'\t",a,a);
return(0);

为什么我要放置unsigned char?当我把它留作char时,我执行了程序,它给了我一个无限循环。当a = 127时,它不应该停止吗?

3 个答案:

答案 0 :(得分:3)

char表示signedunsigned取决于实施。这会使代码的行为实现定义 似乎在你的机器上它是signedsigned char的最小值和最大值为-127&amp;根据C标准分别为+127。任何大于127或小于-127的值都无法分配给a,否则会调用未定义的行为

a到达127后,它会加1,值变为128signed char变量无法保存,因此代码调用undefined行为。

答案 1 :(得分:2)

在Visual Studio上,类型charsigned char相同,范围为-128到+127(均包含在内),因此signed char的所有值都低于128因此,循环条件a < 128总是被满足,循环永远不会停止。

当你有unsigned char时,a的值在某个时刻达到128,并且不会成为下一次迭代。在更改中,如果您尝试增加值{127的signed char变量(期望它取值128),则结果是未定义的。在大多数平台(包括Visual Studio)上,它将环绕(溢出因为127是最高可能值)到最低可能值-128。

答案 2 :(得分:1)

char是有符号还是无符号是依赖于实现的,可能会因编译器和目标体系结构而改变。

对于大多数(可能是所有现代的)CPU架构,signed char的范围为-128 ... 127,unsigned char的范围为0 ... 255(请参阅limits.h,最小范围是-127 ... 127,没有上限。

因此,char似乎已为您的示例签名。由于在这里使用int进行比较(类型强制 - 隐式转换),循环的条件将始终为真,因此循环永远不会终止。

使用扩展范围内的无符号优势,因此循环正常运行。

请注意,如果对char进行算术运算,请始终明确使用signedunsigned。后者往往是更好的选择。如果启用警告,编译器可能会帮助您。但是,不要依赖于此(但请遵循警告显示)。

相关问题