C 和 C# 处理 ANSI 字符

ANSI character handling by C and C#

我有一个字符“¿”。如果我在 C 中用整数转换它,结果是 -61,在 C# 中同样转换,结果是 191。有人能解释一下原因吗。

C Code
char c = '¿';
int I = (int)c;
Result I = -62


C# Code
char c = '¿';
int I = (int)c;
Result I = 191

这就是 singed/unsigned 数字的表示和转换方式。

在您的情况下,看起来 C 编译器的默认值使用 signed byte 作为 char 的基础类型(因为您注意到明确指定使用 unsigend char 编译器的默认值,请参阅 - Why is 'char' signed by default in C++?).

所以 191 (0xBF) 作为有符号字节表示负数(最高有效位为 1)- -65.

如果您使用 unsigned char 值将如您预期的那样保持正值。

如果您的编译器愿意为 char(即 short)加宽类型,则无论 char 是否已签名,191 都将保持为正数 191。

在 C# 中它始终未签名 - 请参阅 MSDN char:

Type: char
Range: U+0000 to U+FFFF

因此 191 将始终如您所愿地转换为 int