почему (unsigned int) выдает отрицательные числа на выходе в C

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

почему ~x создает число с отрицательным знаком, в то время как для знака числа, которое должно быть отражено в первую очередь, не назначен бит?

#include <stdio.h>
void main() {
    unsigned int x = 11;
    printf("not x=%d", ~x);
}

person muhzi    schedule 08.12.2016    source источник


Ответы (2)


Речь идет об интерпретации, которую printf дает параметру, который вы передаете.

unsigned int x = 11;
printf("not x=%d", ~x);

Во время вызова функции продвижение аргументов по умолчанию будет передавать ~x в printf как тип unsigned int. Повышение аргумента по умолчанию применяется из-за va_args из подписи printf.

Кроме того, для вычисления ~x -- от 6.5.3.3 Unary arithmetic operators: применяются целочисленные повышения.

Результатом оператора ~ является побитовое дополнение его (расширенного) операнда (то есть каждый бит в результате устанавливается тогда и только тогда, когда соответствующий бит в преобразованном операнде не установлен). Целочисленные продвижения выполняются над операндом, и результат имеет продвигаемый тип. Если продвигаемый тип является типом без знака, выражение ~E эквивалентно максимальному значению, представленному в этом типе, за вычетом E.

Таким образом, вы передаете целое число без знака, но printf преобразует его в целое число, так как %d ожидает найти целое число.

person alinsoar    schedule 08.12.2016

Это поведение зависит от платформы, но основной ответ заключается в том, что printf не знает, что вещь, которую вы передаете, была объявлена ​​как неподписанная. Это просто ценность. если вы используете формат %d, это значение будет интерпретироваться как целое число со знаком. Если вы используете %u, оно будет интерпретироваться как беззнаковое. В процессоре, использующем представление с дополнением до двух, значение с установленным старшим битом является отрицательным. Поскольку этот бит установлен в ~11, он отображается как отрицательное число.

person Andy Schweig    schedule 08.12.2016
comment
Поведение не определяется реализацией, оно не определено согласно 7.21.6.1.p9. - person Kerrek SB; 08.12.2016
comment
@ Энди Швейг, ты говоришь, что представление битов изменило результат, и это было изменено путем указания разных формул вывода (% d,% u)? пожалуйста, поправьте меня, если я ошибаюсь.. - person muhzi; 08.12.2016