unsigned关键字在这里做什么?

时间:2013-07-05 00:12:04

标签: c++

我写了一些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变量时,我不需要取消变量。那是为什么?

6 个答案:

答案 0 :(得分:26)

unsigned只是意味着这个数字不会变为负数。是的,数字,因为char实际上只是一个8位整数。

所以当unsigned时,每个位都用在非负范围内,从0到255.当你省略并使用signed(默认)字符时,范围将是从-128到127,因此它总是小于128并进入无限循环。

您听到的嘟嘟声是由于值7的字符被“打印”。


另一方面,{p> 1 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 charunsigned char是不同的整数类型。顾名思义,一个是带符号的类型(即可以表示负值),另一个是无符号类型(即.can只表示非负值)。

char类型,没有signedunsigned前缀,是另一种不同的类型。它具有与 signed char unsigned char相同的表示和范围;它是实现定义的。 (一个微妙的观点:即使其中两个具有相同的特征,它们仍然是三种不同的类型。)

对于典型的实现,这三种类型都是8位,签名类型使用二进制补码表示,signed char范围为-128 .. +127和unsigned char范围0 .. +255。

在您的实现中,似乎普通char已签名(这很常见)。因此,如果i的类型为char,那么i < 128 始终为true,并且您有一个无限循环。将charsigned 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,正如你通常所期望的那样。