我试图将 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。255
127
char
是unsigned还是signed,是实现定义的。char
但通常,根据我的经验,它是有符号的,这意味着通常可以达到的最大值是127
.
所以i
从 增加0
到127
,然后变成-128
增加 到127
,依此类推,如果它是有符号的。如果它是unsigned,那么它会从0
to 255
,然后它会变成0
(由于溢出),故事又开始了,一次又一次!
因为的所有值char
都小于 256。
为了进行比较,将char
i
转换为int
,通常会产生介于 -128 和 127 之间的值(带符号的二进制补码 8 位char
s),或者如果char
是无符号 8 位类型,则介于 0 和 255(含)之间。
一旦达到 a 可以保持的最大值,如果是无符号的,char
进一步的增量将导致回绕到 0 ,并导致增量产生的值 128的实现定义的转换,当它被存储回来时,通常是结果是 -128,当被签名时。char
int
char
char
您应该在编译时(-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) << " ";
}