Используйте boost :: lexical_cast
#include "boost/lexical_cast.hpp"
#include <iostream>
int main(int, char**)
{
int a = boost::lexical_cast<int>("42");
if(a < 256 && a > 0)
unsigned char c = static_cast<unsigned char>(a);
}
Документацию вы найдете по адресу http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm
Однако, если целью является сохранение места в файле, я не думаю, что это правильный путь. Как будет вести себя ваша программа, если вы хотите преобразовать «257» в байт? Жусте иди за самое простое. Позже вы разберетесь с любой проблемой использования пробелов, если она уместна (правило большого пальца: всегда используйте «int» для целых чисел, а не для других типов, если нет особой причины, кроме ранней оптимизации)
EDIT
Как говорится в комментариях, это работает только для целых чисел, и переключение на байты не будет (это вызовет исключение).
Так что же произойдет, если вы попытаетесь разобрать «267»?
ИМХО, он должен пройти через int, а затем сделать несколько тестов границ, а затем только бросить в char. Например, если вы пройдете через atoi, это приведет к экстремальным ошибкам.