Я сделал функцию для перевода числа в его двоичную форму:

size_t atobin (char n)
{
    size_t bin= 0, pow;
    for (size_t c= 1; n>0; c++)
    {
        pow= 1;
        for (size_t i= 1; i<c; i++) //This loop is for getting the power of 10
            pow*= 10;
        bin+= (n%2)*pow;
        n/= 2;
    }
    return bin;
}

Он отлично работает для чисел от 1 до 127, но для больших чисел (от 128 до 255) результат равен 0 ... Я пробовал использовать тип long long unsigned int для каждой переменной, но результат был таким же. У кого-то есть представление о том, почему?

0
Miguel B. Pérez 16 Ноя 2017 в 21:06

1 ответ

Лучший ответ

char по умолчанию в C считается подписанным.

char состоит из 8 бит (в основном). А для подписанного символа MSB используется для знака. В результате вы можете использовать только 7 бит.

(0111 1111) 2 = (127) 10 Максимальное значение, с которым может работать ваша функция. (поскольку вы передаете тип переменной, которая может удерживать 127 на максимум).

Если вы используете unsigned char, старший бит не используется как знаковый бит. Все 8 битов используются, что дает нам максимально возможное значение (1111 1111) 2 = (255) 10

Для числа со знаком мин. / Макс. Значение составляет от -127 до +127.

Для беззнакового числа минимальное / максимальное значение составляет от 0 до +255.

Таким образом, даже если вы сделаете тип переданного параметра unsigned char, максимальное значение, которое он может содержать, будет +255.


Чуть подробнее:

В) Что происходит, когда вы присваиваете значения >127 параметру char?

По умолчанию это знаковый символ. Это 8 бит. Но он не выдерживает. Так что же будет?

Результат определяется реализацией. Но

Предположим, значение равно 130. В двоичном формате это 10000010. В большинстве случаев это возвращает -126. Это будет значение n. n>0; не работает. В петлю никогда не заходят. И он возвращает 0.


Теперь, если мы сделаем его беззнаковым символом, он может содержать значения от 0 до 255 (включительно). И это то, что вы хотите здесь.


Заметка:

В) Что происходит, когда значения >255 хранятся в беззнаковых символах?

Значение уменьшается по модулю (max value unsigned char can hold+1), что составляет 256.

Так что примените операцию по модулю и поместите результат. Это будет сохранено в беззнаковом символе.

2
user2736738 16 Ноя 2017 в 18:37