我希望使用c ++将双向量转换为无符号字符。 为了确保它有效,我写道:
unsigned char x = 0;
double y = 4.6;
x = (unsigned char) y;
printf("%d", y);
cout << endl << "the char of 4.6 is: " << x;
getchar();
但不是char等于4或5,我得到的数字很大,如1717986918 或者是cout的钻石符号。
我认为这是因为它将4.6解释为'4.6'但是有没有办法保存它所以它只是变成一个接近相等值的无符号字符?
答案 0 :(得分:4)
带有cout的钻石符号
(unsigned char)4.6
被截断为4
。
但是当你cout
char
时,它会打印相应的字符(例如。cout << char(65)
会打印A
)。如果要打印char
的值,则需要先将其强制转换为更宽的整数类型,例如:
double y = 4.6;
char x = y; // x == 4
cout << (int)x; // prints "4"
// ^^^^^
我得到了一个很大的数字,如1717986918
问题出在您的printf
上,与您提供的参数(%d = signed integer
)相比,您使用了错误的格式说明符(char
)。但是你已经明白了,我只是让我的答案完整。 ;)
同样,你可能想先抛出它:
printf("%d", (int)x);
答案 1 :(得分:2)
我假设你意识到char只能保存double的整数部分,在大多数情况下也是如此(这就是为什么通常双精度转换为char *为字符串,如果你想要完整的数字)。所以你真正想要的是将double的整数部分转换为char,这样一个词法转换就可以了(或itoa,stringstream函数)。例如:
#include <boost/lexical_cast.hpp>
int main() {
unsigned char x;
double y = 4.6;
x = boost::lexical_cast<unsigned char>((int)y);
printf("%f", y);
std::cout << std::endl << "the char of 4.6 is: " << x;
}
答案 2 :(得分:0)
printf("%d", y);
这只是一个错误 - y
是双精度型,%d
格式说明符是整数。
但主要问题是逻辑问题 - 你的数字与他们的陈述相混淆。打印出字符编号4时,没有理由期望它看起来像十进制数字“4”。