unsigned char a;
for(a=32;a<128;a=a+1)
printf("%d='%c'\t",a,a);
return(0);
为什么我要放置unsigned char?当我把它留作char时,我执行了程序,它给了我一个无限循环。当a = 127时,它不应该停止吗?
答案 0 :(得分:3)
char
表示signed
或unsigned
取决于实施。这会使代码的行为实现定义
似乎在你的机器上它是signed
。 signed char
的最小值和最大值为-127
&amp;根据C标准分别为+127
。任何大于127
或小于-127
的值都无法分配给a
,否则会调用未定义的行为。
a
到达127
后,它会加1,值变为128
,signed char
变量无法保存,因此代码调用undefined行为。
答案 1 :(得分:2)
在Visual Studio上,类型char
与signed 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
进行算术运算,请始终明确使用signed
或unsigned
。后者往往是更好的选择。如果启用警告,编译器可能会帮助您。但是,不要依赖于此(但请遵循警告显示)。