0

根据站点, ü 的 ASCii 值为 129,但是当我运行 printf("%d",'ü') 代码时,输​​出为-4。这是什么原因?

4

3 回答 3

4

您获得 -4 的事实基本上是纯粹的机会,因为它取决于您的环境的语言环境设置和编译器的实现。

其他人已经指出,根据您的平台是否认为char已签名,将 char 值打印为整数可能会产生负数0x80和更高的值。


至于编码(请注意,下面的列表绝不是详尽的):

ü没有 ASCII 值,因为 (US-) ASCII仅定义最多 0x7f (127) 的字符。

IBM Codepage 437850 (DOS) 具有üat 0x81,即 -127 或 129,具体取决于签名。

ISO-8859-1 到 -4、-9、-10 和 -13 到 -16以及 Windows 代码页12501252具有ü( 0xfc-4 / 252)。其他 ISO-8859 编码ü在其字符集中没有 。

UTF- 8——由于各种原因,每个人都应该使用它而不是过去的那些 8 位编码——编码ü为两字节序列0xc3 0xbc

我整理了一个并排的代码页供个人使用,如果您有兴趣,可以在我的主页上找到它。


一旦您接受了这一点,请注意该标准定义了两种字符集,一种用于表示源代码,另一种用于表示可执行代码中的字符串。两者都不包含超出基本 AZ 范围的任何字符,两者实际上可能不同(想想交叉编译器),也没有定义其数字表示 - 即您实际上可能正在查看EBCDIC,其中字符甚至没有用连续值编码(即,assert( 'Z' - 'A' == 26 )会失败)。

你觉得这很好笑吗?好吧,基本上你的机器甚至不需要提供像@ASCII 这样的字符,但它不是基本字符集的一部分。;-)

一般来说,一旦你在源代码中使用了非 ASCII 字符,你就会留下定义明确的行为,并且依赖于实现/环境。

于 2013-04-08T13:12:51.200 回答
2

在您的系统上 char 是有符号类型。打印前应先转换为无符号类型。

printf("%d", (unsigned char)'ü');

这是否会打印您期望的 129 是另一回事,但它至少会在您的执行字符集中打印 ü 的编码。

于 2013-04-08T13:12:31.993 回答
1

%d 正在打印一个带符号的十进制数,对于一个字节,它将在 -128-127 的范围内打印)。您可能想要使用无符号 (%u) 来输出预期的 0-255。

于 2013-04-08T13:07:12.713 回答