负ASCII值

use*_*241 11 c c++

负ASCII值有什么意义?

int a = '«'; //a = -85 but as in ASCII table '<<' should be 174
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 11

没有负的ASCII值.ASCII包括128个字符的定义.他们的指数都是正数(或零!).

您看到此负值,因为该字符来自扩展的ASCII集,并且太大而无法放入char字面值.因此,该值溢出到您的char(在您的系统上签名,显然)定义为负面的位.

解决方法是直接写入值:

unsigned char a = 0xAE; // «
Run Code Online (Sandbox Code Playgroud)

我用常规的十六进制表示法编写它,因为我认为它看起来比它更漂亮174.:)

  • @R当然有.这是一个描述一些标准的有点口语的术语,但它们都共享与此问题和答案相关的属性.http://en.wikipedia.org/wiki/Extended_ASCII (2认同)

ndi*_*dim 10

这是编译器char类型的伪影,它是有符号整数类型,并且int是更宽的有符号整数类型,因此字符常量被视为负数,并且符号扩展为更宽的整数类型.

它没有多大意义,只是发生了.C标准允许编译器实现选择它们是认为char是有符号还是无符号.有些编译器甚至有编译时间开关来改变默认值.如果要确保char类型的签名,请分别显式写入signed charunsigned char.

使用a unsigned char扩展为a int以避免负值int,或打开一个全新的潘多拉盒子并享受wchar.

  • "这个角色不符合文字".这真的没有意义.任何狭隘的角色都适合`char`.为了使它不合适,你需要多个字符(`int a ='ab';/*!!*/`).C不要求字符具有正值.因此,实现可以自由地将值-85赋值给'«' (4认同)
  • 不,这是因为角色不适合文字.问题发生在*之前*`int`甚至进入图片.由于溢出,字面值最终为-85,然后将此值-85分配给int.(这可能就是你的意思,我误解了你.) (2认同)

unw*_*ind 3

哪有这回事。ASCII 是一个字符表,每个字符在表中都有一个索引或一个位置。不存在“负”指数。

然而,一些编译器认为char是有符号整型数据类型,这可能是这里造成混乱的原因。

如果将其打印为unsigned int,您将得到解释为无符号(正)值的相同位。