подписанное расширение в c - PullRequest
3 голосов
/ 06 августа 2011

Я попробовал приведенную ниже программу и получил вывод как 72. Я не мог понять, как он выводит как 72.

#include <stdio.h>
int main()
{
    int a=0x27ea4d72;
    char x=a;
    printf("%x",x);
    return 0;
}

Ответы [ 2 ]

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

Из стандарта С:

6.3.1.3 Целые числа со знаком и без знака

  1. Когда значение с целочисленным типом преобразуется в другое целое число тип, отличный от _Bool, если значение может быть представлено новым тип, это без изменений.
  2. В противном случае, если новый тип без знака, значение конвертируется многократно добавляя или вычитая больше, чем максимальное значение, которое может быть представлен в новом типе до значение находится в диапазоне нового типа.
  3. В противном случае новый тип подписывается и значение не может быть представлены в нем; результат реализации.

Преобразование относится к случаю № 3, потому что значения подписаны. Таким образом, результат определяется реализацией.

Однако для кода:

#include <stdio.h>

int main()
{
    unsigned long a = 0x27ea4d72UL;
    unsigned char x = a;
    printf("%x",x);
    return 0;
}

Преобразование относится к случаю № 2, и в этом случае стандарт в основном говорит, что результат будет 0x27ea4d72% (UCHAR_MAX + 1). Где UCHAR_MAX равен 255 (наиболее распространенный случай), вы получите 0x72.

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

Поскольку int обычно шире char, char x=a; усекает назначаемое значение int.

Из Книга "Новый стандарт С" :

В случае преобразования в более узкие целочисленные типы сгенерированный машинный код может зависеть от того, что операция, выполненная по результату приведения. В случае присвоения соответствующий наименее значимый биты неконвертированного операнда обычно сохраняются. Для реализаций других операторов часто обнуляют незначительные биты (выполнение побитовой операции И часто быстрее, чем операция остатка) и для знак типа со знаком расширяет результат

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