我试图将 255 ascii 字符写入控制台,但我有一个无限循环
for(char i=0; i<256; i++) {
cout << i << ' ';
}
我试图将 255 ascii 字符写入控制台,但我有一个无限循环
for(char i=0; i<256; i++) {
cout << i << ' ';
}
因为i永远不可能大于或等于256。它会在它之前溢出。请记住,如果它是unsignedchar ,则它的类型是其最大值,否则如果它是signed。255127
char是unsigned还是signed,是实现定义的。char但通常,根据我的经验,它是有符号的,这意味着通常可以达到的最大值是127.
所以i从 增加0到127,然后变成-128增加 到127,依此类推,如果它是有符号的。如果它是unsigned,那么它会从0to 255,然后它会变成0(由于溢出),故事又开始了,一次又一次!
因为的所有值char都小于 256。
为了进行比较,将char i转换为int,通常会产生介于 -128 和 127 之间的值(带符号的二进制补码 8 位chars),或者如果char是无符号 8 位类型,则介于 0 和 255(含)之间。
一旦达到 a 可以保持的最大值,如果是无符号的,char进一步的增量将导致回绕到 0 ,并导致增量产生的值 128的实现定义的转换,当它被存储回来时,通常是结果是 -128,当被签名时。charintcharchar
您应该在编译时(-Wtautological-compare针对此问题)发出警告。
在 C++ 中,每个整数类型都有一系列可能的值。这个范围是(通常)实现定义的,尽管在通用平台(x86)上经常有:
signed char在 [-128, +127] (+)short在 [-2* 15, 2 *15-1]int在 [-2* 31, 2 *31-1]如果你试图增加一个有符号整数类型超过它的最大值,你就进入了未定义行为的领域。在常见的实现中,它会环绕(就像无符号类型一样),所以 127 + 1 变成 -128 (对于 a char)。
与 进行比较时256,首先将值 fromi转换为 an int(256不带整数后缀的类型),然后执行比较。但是,由于i始终在 [-128, 127] (+) 范围内,因此严格低于256此条件,因此条件始终为真。
(+) 是否char有符号是实现定义的,如果char是无符号的,那么它的范围更可能是 [0, 255]。
尝试这个!
for(int i=0; i<256; i++)
{
cout << char(i) << " ";
}