我想知道为什么这段代码printf char c无限:
char c;
for (c = 0; c< 256; c++)
printf("Char c=%c\n", c);
由于
答案 0 :(得分:3)
假设CHAR_BIT
为8(几乎总是如此),char
对象不能表示值256;签名char
最高为127,而无签名char
最高为255.
签名案例
当c
为127并且您添加1时,值“溢出”。因为在一些奇怪的架构上,一些补码和符号幅度表示仍然是一个问题,所以确切的结果可能会有所不同。对于二进制补码,它将“环绕”到-128,而对于一个补码,它包围到-127,对于符号幅度,它变为-0。
所有这些值都小于256,因此条件c < 256
始终为真。
因为结果可能因平台而异,所以C语言定义对编译器没有要求以任何特定方式处理有符号整数溢出 - 行为是 undefined ,并且任何结果都是就语言而言,同样“正确”。一个相当聪明的编译器可能能够检测到条件将始终评估为true并发出警告,就语言定义而言,可以自由地执行此操作。或不。
未签名案例
与签名的情况不同,无符号整数溢出是明确定义的;如果c
为255并且您添加1,则结果将回绕到0.再次,0小于256,因此c < 256
将始终为真。
答案 1 :(得分:1)
因为char
数据类型只有一个字节长,因此只能保存值0-255
。
因此当c
为255
且您c++
时,它会变为0.因此,c
总是 < 256
在循环中。