Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我声明有符号字符,ASCII值会改变吗?_C++_C++11 - Fatal编程技术网

C++ 如果我声明有符号字符,ASCII值会改变吗?

C++ 如果我声明有符号字符,ASCII值会改变吗?,c++,c++11,C++,C++11,如果我声明signed char k='a'那么k的值是否不是97,这是'a'的ASCII值,因为signed char的范围是-128到127 如果不是,那么有符号字符的范围是什么意思?为什么值会突然改变?ASCII表是一个常量列表,'a'始终与符合ASCII标准的任何语言/环境中的97匹配(因此或多或少都与97匹配) 范围由给定类型的变量中可以包含的最小值和最大值组成 有符号字符有8位,其中1位表示符号,表示实际数据的7位,可以是正的,也可以是负的。因此,它可以包含介于-128和127之间的

如果我声明
signed char k='a'
那么
k
的值是否不是97,这是'a'的ASCII值,因为
signed char
的范围是-128到127


如果不是,那么有符号字符的范围是什么意思?

为什么值会突然改变?ASCII表是一个常量列表,
'a'
始终与符合ASCII标准的任何语言/环境中的97匹配(因此或多或少都与97匹配)

范围由给定类型的变量中可以包含的最小值和最大值组成

有符号字符
有8位,其中1位表示符号,表示实际数据的7位,可以是正的,也可以是负的。因此,它可以包含介于-128和127之间的整数值

无符号字符有8位,全部用于实际数据,这意味着它可以包含0到255之间的整数值



(上面天真地假设了一个现代系统,
char
包含8位,也就是说,正如链接中所解释的,
signed char
的下限在您的特定系统上也可以是-127-请使用
limits.h

我不确定这是否是您要问的问题,但是C++标准保证基本执行字符集中的所有字符都是非负的。从C++11 2.3/3开始:

对于每个基本执行字符集,成员的值 应为非负数且彼此不同

基本执行字符集是26个字母(大写和小写)a-z和a-z、数字0-9、ASCII字符集中的大多数标点符号集(例如,“$”和“@”)以及空格和一些核心控制字符


但是,当使用
有符号字符时,其他字符可能具有负数表示。例如,在一个可能的代码页中,如果
char
无符号,则欧元字符“€”的值为128,但如果
char
有符号,则值为-128。

您不能用一个普通程序检查这一点吗?
97
在-128到127的范围内不仅@MattMcNabb正确,但每个ASCII字符都在0到127之间。还有其他字符集是ASCII的超集,但这可能是一个问题。你所说的“(即所有字符集)”是什么意思?有非ASCII系统(虽然IDK,如果有任何非ASCII系统有一个符合ISC++的编译器)@ MattMcNabb,有足够的用户来实践这个答案的目的吗?这与运行在一个系统中的可能性差不多,
char
实际上有10位。如果你要提到一个角的情况,可能会提到所有的情况:)理论上也有可能,
signed char
将使用一个人的补码或符号大小,在这种情况下,最小值将是
-127
。(但我不知道是否有人曾经为C++做过这件事,虽然他们确实为C做了)我现在把它改成“或多或少都是”,应该让NITPHIPER高兴:PiBM有一个C++编译器,用于ZOS(这是不删除三联表的原因),是C++ 03中的引用吗?它排除了带有签名字符的EBCDIC系统。是的,C++03也这么说。我没有使用过EBCDIC系统,但只要看一下Wikipedia的表,就会发现它看起来像是未签名的字符,或者需要一个超过8位的
char
类型才能满足这个要求。一个关注点-C标准(直至C11)不要求这些值为非负值。我对C和C++之间的细节有点惊讶,但不是很多。EBCDIC不再仅仅是一种历史好奇心吗?@MichaelBurr这是错误的。ISO C99在6.2.5p3中说:“如果基本执行字符集的一个成员存储在
char
对象中,则其值保证为非负。”因此,它具有与C++03相同的要求。这意味着EBCDIC实现必须具有类似于无符号字符的
char
。另见: