2016-10-03 4 views
0
#include <stdio.h> 

int main() 
{ 
    char c = 255; 
    if (c > 128) 
    { 
     printf("This is unsigned number %d\n", c); 
    } 
    else 
    { 
     printf("This is signed number %d\n", c); 
    } 
} 

Что происходит в этом случае, когда мы инициализируем подписанный символ, который имеет диапазон от -127 до 128 с 255? Это не обертывается, потому что это неопределенное поведение, но что на самом деле происходит?Ошибка преобразования типа в C

Я получаю -1 результат, но как и почему?

+1

Вы спрашиваете, что происходит в неопределенном поведении? Шутки в сторону? –

+0

Это не неопределенное поведение, но реализация определена. Так что это зависит от вашего компилятора. –

+0

@JensGustedt передает char на% d, хорошо? –

ответ

3

Это неправильное поведение. Соответствующая часть стандартного 6.3.1.3 § 3:

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

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

Обратите внимание: тип char может быть либо подписанным, либо беззнаковым, что также зависит от компилятора.

Смежные вопросы