这里的unsigned关键字的作用是什么
What does the unsigned keyword do here?
我写了一些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 char
和unsigned char
是不同的整数类型。顾名思义,一种是有符号类型(即可以表示负值),另一种是无符号类型(例如.只能表示非负值)。
没有signed
或unsigned
前缀的类型char
是另一种不同的类型。它具有与相同的表示和范围,要么signed char
要么unsigned char
;哪一个是实现定义的。(微妙的一点是:它们仍然是三种不同的类型,尽管其中两种具有相同的特征。)
对于典型的实现,这三种类型都是8位,有符号类型使用二补表示,使signed char
的范围为-128+127和CCD_ 24的范围为0+255.
在您的实现中,似乎对普通的char
进行了签名(这很常见)。因此,如果i
的类型是char
,那么i < 128
的总是true,并且有一个无限循环。将char
或signed char
对象递增超过其最大值实际上有未定义的行为,但通常它会从最大值到最小值,这就是您所看到的。(当打印的字符是