Я ищу, чтобы изменить вектор двойников в беззнаковых символов с помощью 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();
но вместо того, чтобы символ был равен 4 или 5, я получаю огромное число, например 1717986918
или алмазный символ с кутом.
Я предполагаю, что это потому, что он интерпретирует 4.6 как «4.6», но есть ли способ сохранить его, чтобы он просто стал беззнаковым символом почти равного значения?
алмазный символ с кут
(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);
Я предполагаю, что вы понимаете, что char может содержать только целую часть двойного числа и в большинстве случаев тоже 255 (поэтому, как правило, двойные числа преобразуются в char * в строки, если вам нужно полное число). Итак, что вы действительно ищете, так это приведение целочисленной части двойного числа к типу char, чтобы лексическое приведение сработало бы (или даже функции 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;
}
printf("%d", y);
Это просто ошибка — y
двойной, а %d
спецификатор формата для целых чисел.
Но главная проблема — логическая проблема — вы путаете числа с их представлениями. Когда вы печатаете символ № 4, нет никаких оснований ожидать, что он будет выглядеть как десятичная цифра «4».