C: GCC неявно преобразует подписанный символ в unsigned Char и наоборот?

Я пытаюсь выучить C при застревании с размерами DataType на данный момент.

Посмотрите на этот фрагмент кода:

#include <stdio.h>
#include <limits.h>

int main() {
    char a = 255;
    char b = -128;
    a = -128;
    b = 255;
    printf("size: %lu\n", sizeof(char));
    printf("min: %d\n", CHAR_MIN);
    printf("max: %d\n", CHAR_MAX);
}

PrintF-выход:

size: 1
min: -128
max: 127

Как это возможно? Размер CHAR - это 1 байт, а символ по умолчанию, кажется, подписан (-128 ... 127). Итак, как я могу назначить значение> 127, не получив предупреждение о переполнении (которое я получаю, когда я пытаюсь назначить -128 или 256)? GCC автоматически преобразует в unsigned Char? А затем, когда я назначаю отрицательное значение, это конвертирует обратно? Почему это делает это? Я имею в виду, все это неясность не сделало бы легче понять.

Редактировать:

Хорошо, это не преобразует что-либо:

char a = 255;
char b = 128;
printf("%d\n", a);    /* -1 */
printf("%d\n", b);    /* -128 */

, поэтому он начинает подсчитывать снизу вверх. Но почему компилятор не дает мне предупреждение? И зачем это так, когда я пытаюсь присвоить 256?

9
задан j0ker 1 September 2011 в 09:54
поделиться