Почему я получаю неправильный двоичный шаблон? - PullRequest
0 голосов
/ 11 июля 2019

Я пишу функцию для печати двоичного представления целого числа, которое составляет 4 байта на моем компьютере. Я создаю mask = 0x80000000, который должен быть ( 10000000 00000000 00000000 00000000 )

и создание цикла для смещения этой маски вправо и выполнение операции and, и если она будет равна 1, я напечатаю 1, в противном случае я напечатаю 0, но я получаю неправильные результаты!

Например: для десятичной 10 я получаю 00000000 00000000 00000000 00001111.

#include <stdio.h>

void Binary( int ) ;
int main()
{
    Binary(10) ; // 00000000 00000000 00000000 00001111
    while(1);
    return 0;
}

void Binary( int num )
{
    int mask = 0x80000000 ;
    for(int i = 0 ; i<32; i++)
    {
        if( (mask>>i)&num )
        {
            printf("1") ;
        }
        else
        {
            printf("0") ;
        }
    }
}

1 Ответ

1 голос
/ 11 июля 2019

Когда вы сдвигаете int вправо, он заполняется битом знака, потому что он подписан.Итак, 0x80000000 >> 1 - это 0xc0000000;>> 2 - это 0xe0000000;>> 23 - это 0xffffffff;>> 31 равно 0xffffffff.

Значение 10 является двоичным 1010, поэтому оно равно нулю для каждого i в 28,29,30,31.Вы можете проверить это, изменив вашу программу, чтобы попробовать разные цифры:

4: 00000000000000000000000000000111
8: 00000000000000000000000000000111
15:00000000000000000000000000001111
16:00000000000000000000000000011111

Как отмечается в комментариях, если вы переключитесь на unsigned, этого не произойдет.

ps: Это полностьювозможно, что изменение подписи было переопределено как неопределенное поведение, и в этом случае вам повезло, что ваш дом не сгорел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...