这里的unsigned关键字的作用是什么

What does the unsigned keyword do here?

本文关键字:是什么 作用 unsigned 这里 关键字      更新时间:2023-10-16

我写了一些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时,结果会变得无限大,电脑会发出嘟嘟声,直到我关闭可执行文件。但是,当我使用int i变量时,我不需要取消对该变量的签名。为什么?

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

因此,当unsigned时,每个比特都在非负范围内使用,该范围将从0到255。当您省略并使用signed(默认)字符时,范围将从-128到127,因此它将始终小于128并进入无限循环。

您听到的嘟嘟声是由于值为7的字符正在"打印"。


另一方面,一个int,即使是有符号的,也会从-21.47…billion一直到+21.47 billion,所以它会正常迭代,直到达到128并停止。

有符号的char类型范围从-128+127

因此,i<128永远不可能是false,因此您的循环永远不会终止。

相反,作为有符号字符的127 + 1将环绕到-128(因为它将设置符号位),然后第二次循环。

第二次迭代将包括每个字符,包括打印时会发出哔哔声的a(铃声)。

无符号表示变量只包含正值,这意味着它们可以包含更大的正数。无符号字符的范围通常为0到255,有符号字符的区域为-128到+127。这在不同的硬件上可能会有所不同(但在你可能遇到的大多数硬件上不会)。

当一个变量从其最大值开始递增时,它就会溢出。变量的结果取决于它是否为无符号变量。无符号类型保证变为0,而有符号类型的行为是未定义的。在我见过的大多数系统中,变量都会达到最小值(在本例中为-128),但你不能依赖这种行为。

这意味着变量永远不会达到128,因此循环将永远继续。

如果你转到这个页面并查看基本数据类型,你可以看到所有基本类型的有符号与无符号的典型范围:http://www.cplusplus.com/doc/tutorial/variables/

类型signed charunsigned char是不同的整数类型。顾名思义,一种是有符号类型(即可以表示负值),另一种是无符号类型(例如.只能表示非负值)。

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

对于典型的实现,这三种类型都是8位,有符号类型使用二补表示,使signed char的范围为-128+127和CCD_ 24的范围为0+255.

在您的实现中,似乎对普通的char进行了签名(这很常见)。因此,如果i的类型是char,那么i < 128总是true,并且有一个无限循环。将charsigned char对象递增超过其最大值实际上有未定义的行为,但通常它会从最大值到最小值,这就是您所看到的。(当打印的字符是07,ASCII BEL字符时,可能会发出嘟嘟声;要么是这样,要么是您发送的控制字符扰乱了您的终端。)

i设为unsigned char,使其范围从0到255,当达到128时,循环停止。(将无符号类型的值递增超过其最大值是很好的定义,但无论如何你都不会这么做。)

int始终是一个有符号类型,语言要求其范围至少为-32767+目前,它通常是32位,范围为-2147483648+2147483647。但即使有最小的所需范围,它也足以满足您的循环。

signed char的范围从-128到+127,因此它将始终小于128

当你做

signed i=127;
i++;

i通常是-128(但你不能用这种行为来计算)

unsigned char范围从0到255

并非所有ASCII字符都可打印!把它们打印出来是无稽之谈。

有符号的字符(至少在典型情况下)只能表示-128到+127之间的值。由于它永远不可能具有值128,因此循环将永远运行。

正式地说,当它的值为127并且您递增时,结果是未定义的行为。事实上,在几乎任何一台典型的机器上(任何使用2的补码的机器),当它的值为127并且你递增时,它会回到-128,再递增到127,回到-128并再次经历整个循环。

对于无符号字符,您可以获得从0到(至少)255的值,因此当您获得127并递增时,该值将变为128,从而按预期结束循环。

同样,int的范围要求至少在-32767到+32767之间。因此,当它的值为127,并且您递增时,结果将是128,正如您通常预期的那样。