根据that站点,AS的值为99,但是当我运行printf(“%d”,“ü”)代码时,输出为-4。这是什么原因?
答案 0 :(得分:4)
你获得-4的事实基本上是纯粹的机会,因为它取决于环境的区域设置和编译器的实现。
其他人已经指出,根据您的平台是否认为char
要签名,打印char值就好像它是一个整数可能会产生0x80
及更高值的负数
至于编码(并注意下面的列表并非详尽无遗):
ü
没有ASCII值,因为(US-)ASCII只定义了最多0x7f(127)的字符。
IBM Codepage 437和850(DOS)ü
位于0x81
,根据签名情况为-127或129.
ISO-8859-1 through -4, -9, -10, and -13 through -16以及Windows代码页1250和1252在ü
(-4 / 252)处有0xfc
。其他ISO-8859编码的字符集中没有ü
。
UTF-8 - 每个人都应该使用而不是那些variety reasons的过去的8位编码 - 将ü
编码为双字节序列{ {1}}。
我已经将一个并排的代码页放在一起供个人使用,如果您有兴趣,可以在my homepage找到它。
一旦你了解了它,请注意标准定义了两个character sets,一个用于表示源,另一个用于表示可执行代码中的字符串。既不包含基本AZ范围之外的任何字符,两者可能实际上是不同的(想想交叉编译器),也没有定义其数值表示 - 即你实际上可能正在查看EBCDIC,其中字符不均匀用连续值编码(即0xc3 0xbc
将失败)。
assert( 'Z' - 'A' == 26 )
这样的字符,因为它是ASCII,但不是基本字符集的一部分。 ; - )
一般来说,一旦在源代码中使用非ASCII字符,就会留下明确定义的行为,并依赖于实现/环境。
答案 1 :(得分:2)
在您的系统上,char是签名类型。您应该先打印前转换为无符号类型。
printf("%d", (unsigned char)'ü');
这是否会打印您期望的129是另一回事,但它至少会在执行字符集中打印ü的编码。
答案 2 :(得分:1)
%d正在打印带符号的十进制数,对于一个字节,将打印在-128-127范围内。您可能希望使用无符号(%u),它将输出预期的0-255。