负ASCII值

时间:2011-01-14 11:11:25

标签: c++ c

负的ASCII值有什么意义?

int a = '«'; //a = -85 but as in ASCII table '<<' should be 174

6 个答案:

答案 0 :(得分:10)

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

它没有多大意义,只是发生了。 C标准允许编译器实现选择是否将char视为有符号或无符号。有些编译器甚至有编译时间开关来改变默认值。如果您想确保char类型的签名,请分别明确写下signed charunsigned char

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

答案 1 :(得分:10)

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

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

解决方法是直接写入值:

unsigned char a = 0xAE; // «

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

答案 2 :(得分:3)

没有这样的事情。 ASCII是一个字符表,每个字符在表中都有一个索引或一个位置。没有“负面”指数。

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

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

答案 3 :(得分:2)

ASCII范围0..127,ANSI(也称为“扩展ASCII”)范围为0..255。

ANSI范围不适合签名字符(大多数编译器中字符的默认类型)。

大多数编译器都有像'char'类型是无符号(GCC)的选项。

答案 4 :(得分:1)

我有这个神器。当您使用char作为符号时,您没有问题。但是当你将它用作整数(使用isalpha()等)并且ASCII代码大于127时,则'char'解释为'signed char'并且isalpha()返回异常。当我需要使用'char'作为整数时,我将'char'转换为unsigned:

  • isalpha((unsigned char)my_char);

@ n0rd:koi8代码页使用128到255的ascii和其他国家代码页:http://www.asciitable.com/

答案 5 :(得分:0)

在字符表示中,您分配了8位(1个字节)。 除此之外,第一位用于表示符号。在无符号字符的情况下,它使用全8位来表示允许0到255的数字 128-255称为扩展ASCII。 由于我所描述的内存中的表示,我们得-1具有与255相同的值,char(-2)==char(254)