2

我正在寻找使用 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' 但有没有办法保存它,所以它只是变成一个接近相等值的无符号字符?

4

3 回答 3

6

带 cout 的菱形符号

(unsigned char)4.6被截断为4

但是当你coutachar它打印相应的字符(例如cout << char(65)将打印A)。如果要打印您的char则需要先将其转换为更广泛的整数类型,例如:

double y = 4.6;
char x = y;     // x == 4
cout << (int)x; // prints "4"
//      ^^^^^

我得到一个巨大的数字,比如 1717986918

问题在于您的,与您提供的参数 (a ) 相比printf,您使用了错误的格式说明符 ( )。但是您已经知道了,我只是在完善我的答案。;)%d = signed integerchar

同样,您可能想先投射它:

printf("%d", (int)x);
于 2013-09-06T20:21:01.140 回答
2

我假设您意识到 char 只能保存双精度数的整数部分,并且在大多数情况下也可以保存到 255(这就是为什么如果您想要完整的数字,通常双精度数会转换为 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;
}
于 2013-09-06T20:45:22.260 回答
0
printf("%d", y);

这只是一个错误 -y是一个双精度数,%d格式说明符用于整数。

但主要问题是逻辑问题——你把数字和它们的表示混淆了。当您打印出第 4 个字符时,没有理由期望它看起来像十进制数字“4”。

于 2013-09-06T20:37:52.310 回答