Целое число со знаком в C - PullRequest
       2

Целое число со знаком в C

3 голосов
/ 28 августа 2011
#include<stdio.h>

int main()
{
    unsigned int a=6;
    int b=-20;
    (a+b>6)?puts(">6"):puts("<=6");
    return 0;
}

Приведенный выше код выводит >6. Но у меня есть сомнения. b=-20 будет содержать отрицательное значение (-18) после выполнения дополнения до 2, так как это целое число со знаком. Таким образом, он должен вывести <=6, но его выдавая вывод >6.

Ответы [ 3 ]

9 голосов
/ 28 августа 2011

Из стандарта C99, раздел 6.3.1.8 («Обычные арифметические преобразования»):

, если операнд с целочисленным типом без знака имеет ранг, больший или равный рангу типадругой операнд, тогда операнд с целочисленным типом со знаком преобразуется в тип операнда с целочисленным типом без знака.

В основном, в случае вашего примера кода, unsigned int и int имеюттого же ранга, поэтому он эквивалентен:

(a + (unsigned int)b > 6)

Чтобы исправить это, вам нужно явно привести в другом направлении, то есть:

((int)a + b > 6)
1 голос
/ 28 августа 2011

Вы смешиваете целые числа со знаком и без знака в своем коде. Это плохая вещь . Попробуйте следующий фрагмент:

int main()
{
    unsigned int a = 0;
    int b=-20;
    printf("(a + b) = %f", (a + b));
    return 0;
}

Не смешивайте целые числа со знаком и без знака, потому что компилятор выполняет преобразование без вывода сообщений, когда вы этого не хотите.

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

Ответ можно найти в разделе «6.3.1.8 Обычные арифметические преобразования» стандарта C99, который одобряет тип без знака, когда тип со знаком и без знака передается бинарному оператору (реальность гораздо более тонкая чем это).

См. в этом блоге , где приведен еще один пример работы с правилами в 6.3.1.8.

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