2014-09-30 1 views
2

Что такое битовое представление unsigned int x =-1; Можно ли назначить unsigned int с отрицательным целым?битовое представление unsigned int a = -1

#include<stdio.h> 
int main(){ 
    unsigned int x = -1; 
    int y = ~0; 
    if(x == y) 
     printf("same"); 
    else 
     printf("not same"); 
    return 0; 
} 

выход:

же

и как это возможно, х является беззнаковым

#include<stdio.h> 

int main()  
{ 

unsigned int x = -4; 
if (x == -4) 
    printf("true"); 
else 
    printf("FALSE"); 
} 

выход:

истинная

+0

без знака не может быть отрицательным :) , когда вы написали слово «без знака» не думаю, что это значит? –

+0

Ответ на ваш вопрос уже приведен в вашем примере. – dari

+0

Я имею в виду, как -1 представляется в двоичной форме. Какова логика, что -1 и 1 одинаковы. –

ответ

6

Когда unsigned int значения сравниваются с int значения, значение int неявно преобразуются в unsigned int типа. Результатом этого преобразования является congruent с исходным значением по модулю 2 N, где N - это число битов формирования значения в unsigned int. Этот модуль равен UINT_MAX + 1.

По этой причине инициализации

unsigned int x = -1; 

инициализирует x с каким-то значение без знака congruent к -1 по модулю UINT_MAX + 1. Кстати, это не что иное, как UINT_MAX. Это значение имеет 1 в каждом бите формирования значения объекта unsigned int. Он работает таким образом с любым беззнаковым типом.

Выражение ~0 оценивается в области signed int типа, а затем y неявно преобразуется в unsigned int в x == y сравнения. По-видимому, на вашей платформе конверсия производит то же значение unsigned int со всеми битами формирования значений, установленными на 1. Отсюда и равенство.

Инициализация

unsigned int x = -4; 

инициализирует x с каким-то значение без знака congruent к модулю -4UINT_MAX + 1. В сравнении x == -4 правая часть преобразуется в неподписанный тип по тем же правилам. Отсюда и равенство.

+1

+1 для «каждого бита формирования значения». – chux

+1

Точно. «Когда значение с целым типом преобразуется в [...] без знака, значение преобразуется путем многократного добавления или вычитания одного большего, чем максимальное значение, которое может быть представлено в новом типе, пока значение не окажется в диапазоне нового типа. »(C11, §6.3.1.3). –

2

и как это возможно, х будучи беззнаковое

Это «обычные арифметические преобразования» - операнды по обе стороны == имеют разные типы, поэтому они должны быть преобразованы в сначала. Правило для типов int или больше, когда типы отличаются только подписью, заключается в том, что unsigned выигрывает, поэтому он преобразует -4 в эквивалентное эквивалентное значение, как это было, когда вы назначили -4 в целое число без знака.

Для получения дополнительной информации см How do promotion rules work when the signedness on either side of a binary operator differ?

+0

@mafso: А, я имею в виду типы одного размера. Подробные подробные сведения находятся по ссылке, которую я добавил. –

0

в междунар отрицательные целые числа хранятся в 2-х с дополнением.

Предположим, у нас есть тип данных, говорящий о 4 битах.

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

так 1 может быть записана как 0001

и -1, оно должно быть написано в дополнении 2, поскольку он отрицателен;

-1 = ~ (0001) +1 = (1110) + 1 = 1111;

так что делает этот тип данных без знака читает -1, как 15

+0

Обратите внимание, что это справедливо только для машин дополнения 2, которые стандарт C не требует. –

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