根据该站点, ü 的 ASCii 值为 129,但是当我运行 printf("%d",'ü') 代码时,输出为-4。这是什么原因?
3 回答
您获得 -4 的事实基本上是纯粹的机会,因为它取决于您的环境的语言环境设置和编译器的实现。
其他人已经指出,根据您的平台是否认为char
已签名,将 char 值打印为整数可能会产生负数0x80
和更高的值。
至于编码(请注意,下面的列表绝不是详尽的):
ü
没有 ASCII 值,因为 (US-) ASCII仅定义最多 0x7f (127) 的字符。
IBM Codepage 437和850 (DOS) 具有ü
at 0x81
,即 -127 或 129,具体取决于签名。
ISO-8859-1 到 -4、-9、-10 和 -13 到 -16以及 Windows 代码页1250和1252具有ü
( 0xfc
-4 / 252)。其他 ISO-8859 编码ü
在其字符集中没有 。
UTF- 8——由于各种原因,每个人都应该使用它而不是过去的那些 8 位编码——编码ü
为两字节序列0xc3 0xbc
。
我整理了一个并排的代码页供个人使用,如果您有兴趣,可以在我的主页上找到它。
一旦您接受了这一点,请注意该标准定义了两种字符集,一种用于表示源代码,另一种用于表示可执行代码中的字符串。两者都不包含超出基本 AZ 范围的任何字符,两者实际上可能不同(想想交叉编译器),也没有定义其数字表示 - 即您实际上可能正在查看EBCDIC,其中字符甚至没有用连续值编码(即,assert( 'Z' - 'A' == 26 )
会失败)。
你觉得这很好笑吗?好吧,基本上你的机器甚至不需要提供像@
ASCII 这样的字符,但它不是基本字符集的一部分。;-)
一般来说,一旦你在源代码中使用了非 ASCII 字符,你就会留下定义明确的行为,并且依赖于实现/环境。
在您的系统上 char 是有符号类型。打印前应先转换为无符号类型。
printf("%d", (unsigned char)'ü');
这是否会打印您期望的 129 是另一回事,但它至少会在您的执行字符集中打印 ü 的编码。
%d 正在打印一个带符号的十进制数,对于一个字节,它将在 -128-127 的范围内打印)。您可能想要使用无符号 (%u) 来输出预期的 0-255。