这段代码无限次打印多少次?

时间:2016-11-21 20:32:47

标签: c

我想知道为什么这段代码printf char c无限:

char c;
for (c = 0; c< 256; c++)
printf("Char c=%c\n", c);

由于

2 个答案:

答案 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

因此当c255且您c++时,它会变为0.因此,c 总是 < 256在循环中。