我写了一些C ++代码来在我正在阅读的书中找到的控制台上显示ASCII字符。代码看起来像这样:
#include <iostream>
using namespace std;
int main()
{
for (unsigned char i = 32; i<128; i++)
cout << i;
int response;
cin >> response;
return 0;
}
当我取走unsigned
关键字并改为使用signed
时,结果将变为无限,并且PC会发出蜂鸣声,直到我关闭可执行文件。但是当我使用int i
变量时,我不需要取消变量。那是为什么?
答案 0 :(得分:26)
unsigned
只是意味着这个数字不会变为负数。是的,数字,因为char
实际上只是一个8位整数。
所以当unsigned
时,每个位都用在非负范围内,从0到255.当你省略并使用signed
(默认)字符时,范围将是从-128到127,因此它总是小于128并进入无限循环。
您听到的嘟嘟声是由于值7的字符被“打印”。
int
,即使签名从-2.147 ......数十亿到+2.147亿,所以它会正常迭代,直到达到128并停止。
答案 1 :(得分:8)
签名的char
类型的范围从-128
到+127
。
因此,i<128
永远不会为假,因此您的循环永远不会终止。
相反,作为签名字符的127 + 1
将回绕到-128
(因为它将设置符号位),然后第二次继续循环。
第二次迭代将包括每个字符,包括\a
(铃声),在打印时会发出哔哔声。
答案 2 :(得分:5)
无符号意味着变量只包含正值,这意味着它们可以包含更大的正数。 unsigned char的范围通常为0到255,signed char的范围是-128到+127。这可能因硬件而异(但不会出现在您可能遇到的大多数硬件上)。
当变量从其最大值递增时,它会溢出。变量会发生什么取决于它是否是无符号的。保证无符号类型为0,而有符号类型的行为未定义。在我见过的大多数系统中,变量都会回绕到最小值(在本例中为-128),但是你不能依赖这种行为。
这意味着变量永远不会达到128,所以循环将永远持续。
如果您转到此页面并查看基本数据类型,您可以看到所有基本类型的已签名与无符号的典型范围:http://www.cplusplus.com/doc/tutorial/variables/
答案 3 :(得分:3)
signed char
范围是-128到+127,所以它总是小于128
当你这样做时
signed i=127;
i++;
i
通常为-128(但你不能指望这种行为)
unsigned char
范围是0到255
并非所有ASCII字符都可打印!打印它们是无稽之谈。
答案 4 :(得分:3)
类型signed char
和unsigned char
是不同的整数类型。顾名思义,一个是带符号的类型(即可以表示负值),另一个是无符号类型(即.can只表示非负值)。
char
类型,没有signed
或unsigned
前缀,是另一种不同的类型。它具有与 signed char
或 unsigned char
相同的表示和范围;它是实现定义的。 (一个微妙的观点:即使其中两个具有相同的特征,它们仍然是三种不同的类型。)
对于典型的实现,这三种类型都是8位,签名类型使用二进制补码表示,signed char
范围为-128 .. +127和unsigned char
范围0 .. +255。
在您的实现中,似乎普通char
已签名(这很常见)。因此,如果i
的类型为char
,那么i < 128
始终为true,并且您有一个无限循环。将char
或signed char
对象递增超过其最大值实际上具有未定义的行为,但通常它会从最大值回绕到最小值,这就是您所看到的。 (当打印的字符为\007
,ASCII BEL
字符时,可能会产生哔声;要么是这样,要么是您发送的控制字符会弄乱您的终端。)
使i
成为unsigned char
会给出0到255之间的范围,并且当它达到128时你的循环停止。(无符号类型的值增加超过其最大值已经明确定义,但是反正你也不这样做。)
int
始终是签名类型,语言要求其范围至少为-32767 .. + 32767。这些天,它通常是32位,范围是-2147483648 .. + 2147483647。但即使有最低要求范围,它也足以让你的循环变得足够大。
答案 5 :(得分:1)
签名字符(至少在典型情况下)只能表示-128到+127之间的值。因为它永远不会有值128,所以你的循环永远运行。
正式地,当它具有值127并且您递增时,结果是未定义的行为。实际上,几乎任何典型的机器(任何使用2的补码)当它具有值127并且你递增时,它将回绕到-128,增加回到127,回绕到-128并经历整个循环试。
使用unsigned char,可以得到0到(至少)255的值,所以当你到达127并递增时,值会变为128,按预期结束循环。
同样,int
的范围必须至少为-32767到+32767。因此,当它的值为127并且你递增时,结果将是128,正如你通常所期望的那样。