我不明白为什么从int转换为char会给我一个超出(char)范围的数字?这是我的C ++程序:
#include <cmath>
#include <stdio.h>
int main(){
printf("%c\n",(char) 246 );
printf("%d\n", (char) (246) );
}
我得到了
\366
-10
任何解释?我需要的是从int转换为char
char int2char(int i);
返回截断的&#39; i&#39;到了char。当然,有人可以通过某些(i mod 256)
执行此操作,但我正在寻找一种使用类型转换来执行此操作的方法。任何的想法?
答案 0 :(得分:4)
执行时:
char c = 246;
int i = c;
printf("%d\n", i);
相当于执行:
char c = 246;
棘手的部分是行
中发生的事情246
11110110
在{bin>中存储为char
。
在您的平台上,signed
似乎是char
。当signed
为-10
时,该二进制数的整数值等于c
。因此,-10
的值设置为i
,-10
的值也设置为value
。
答案 1 :(得分:3)
原生char
类型可以是已签名或未签名。它似乎已在您的计算机上签名。
如果您想确保结果在[0, 255]
范围内,请改用unsigned char
。
static_cast<unsigned char>(246)
答案 2 :(得分:1)
您的C ++编译器将char
视为签名的 8位整数,范围为-128到127,而不是无符号 8位整数范围为0到255。
问题不在于int
- 到 - char
转换,而是char
- 到 - int
转换,可以通过强制转换来完成({ {1}}或i = (unsigned char) c
)或位掩码(i = static_cast<unsigned char>(c)
)。