целое число без знака в c - PullRequest
       2

целое число без знака в c

2 голосов
/ 06 августа 2011

Учитывая программу, подобную приведенной ниже, как определить, перейдет ли целое число со знаком в значение -ve или +.

int main()
{
    int a=0xDEADBEEF;
    printf("%d",a);
    return 0;
}

Это выводит в -ve. Но есть ли простой способ его идентификациибыстро без выполнения в визуальной студии.

Ответы [ 5 ]

6 голосов
/ 06 августа 2011

С некоторой побитовой магией:

int negative = (input >> ((sizeof(int) * 8) - 1)) & 0x01;

Чтобы объяснить это:

В C отрицательные числа являются дополнением до двух, где старший бит обозначает знак.Сначала мы определяем, сколько бит int имеет на текущей платформе, используя sizeof(int) * 8.Чтобы получить старший бит с помощью правого сдвига, нам нужно сдвинуть на size - 1.Поскольку правый сдвиг арифметический в C (то есть, если старший бит равен 1, мы заполняем int с помощью 1 s слева), нам нужно убить все лишние биты, используя логические и с 0x01 (илипросто 1, что вы предпочитаете).

В результате получается int со значением 1, если входной сигнал отрицательный, или 0, если он положительный.

ЕслиВы хотите сделать это на бумаге, взять старший байт (в вашем случае DE), записать верхнюю половину (D) и проверить, является ли старший бит ноль или единицу.

3 голосов
/ 06 августа 2011

Проверьте, меньше ли значение 0x80, 0x8000, 0x80000000 или 0x8000000000000000, в зависимости от разрядности типаЕсли оно меньше, чем положительное, в противном случае оно отрицательное.

1 голос
/ 06 августа 2011

Если первый бит (знаковый бит) равен 1, то значение является отрицательным.В противном случае оно положительное.

Кстати, есть еще одно отрицательное число по сравнению с количеством положительных чисел.

0 голосов
/ 06 августа 2011

0xDEADBEEF больше INT_MAX в вашей системе (0x7FFFFFFF), поэтому преобразование в int определяется реализацией.Обычные реализации дополнения двойки определяют его как уменьшение по модулю 2*INT_MAX+2 в диапазон [INT_MIN,INT_MAX].

0 голосов
/ 06 августа 2011

Вы должны знать ширину (число битов значения) в int, чтобы принять решение об этом.

Вы также должны были бы дать \n в конце строки формата, чтобы иметь вывод.

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