从 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) c
或 i = 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
。
看起来在您的平台上,char
是 signed
。当char
为signed
时,该二进制数的整数值等于-10
。因此,c
的值设置为-10
,i
的值也设置为-10
。
我不明白为什么从 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) c
或 i = 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
。
看起来在您的平台上,char
是 signed
。当char
为signed
时,该二进制数的整数值等于-10
。因此,c
的值设置为-10
,i
的值也设置为-10
。