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