从 int 到 char 的转换时如何得到 [0,255] 之外的数字?

how I get a number outside [0,255] when doing a converson from int to char?

我不明白为什么从 int 到 char 的转换会给我一个超出 (char) 范围的数字?这是我的 C++ 程序:

#include <cmath>
#include <stdio.h>
int main(){
  printf("%c\n",(char) 246 );
  printf("%d\n", (char) (246) );
}

我明白了

6
-10

有什么解释吗?我这里需要的是从 int 到 char

的转换
char int2char(int i);

即returns截断'i'为char。当然,可以通过一些 (i mod 256) 来做到这一点,但我正在寻找一种使用类型转换来做到这一点的方法。任何的想法?

原生 char 类型可以是有符号的或无符号的。它似乎已在您的机器上签名。

如果您想确保结果在 [0, 255] 范围内,请改用 unsigned char

static_cast<unsigned char>(246)

您的 C++ 编译器将 char 视为 有符号 8 位整数,范围为 -128 到 127,而不是 无符号 8位整数,范围为0到255.

问题不在于 int-to-char 转换,而是 char-to-int 转换,这可以通过任一转换来完成(i = (unsigned char) ci = static_cast<unsigned char>(c)) 或位掩码 (i = c & 0xFF).

当你执行:

printf("%d\n", (char) (246) );

相当于执行:

char c = 246;
int i = c;
printf("%d\n", i);

棘手的部分是行中发生的事情

char c = 246;

246 在二进制文件中存储为 11110110

看起来在您的平台上,charsigned。当charsigned时,该二进制数的整数值等于-10。因此,c的值设置为-10i的值也设置为-10