2015-03-05 2 views
0

Что я знаю - UNSIGNED INT не может принимать отрицательные значения.
Если я беру maximum value в качестве UNSIGNED INT и увеличить его, я должен получить ZERO т.е. minimum value и если я беру minimum value и уменьшить его, я должен получить maximum value.
Тогда почему это происходит?
C - unsigned int going negative (-ve)

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

int main() 
{ 
    unsigned int ui; 
    ui = UINT_MAX; 
    ui ++; 
    printf("ui = %d", ui); 

    ui = 0; 
    ui --; 
    printf("\n"); 
    printf("ui = %d", ui); 

    return EXIT_SUCCESS; 
} 

Выход:

ui = 0 
ui = -1 
+0

его из-за переполнения int – sashas

+1

'% d'? не должно быть '% u'? – WhozCraig

+0

Я должен прочитать спецификацию, но IIRC либо переполнение, либо недополнение, скорее всего, [* неопределенное поведение *] (http://en.wikipedia.org/wiki/Undefined_behavior). –

ответ

1

Вы передать значение в функцию многоточием (printf). Здесь вы ничего не должны ожидать о подписании.

%d в строке формата контролирует знак отображаемого значения. Внутри функции printf есть литье, так как вы выбрали %d. Вот почему вы видите значение signed, эквивалентное двоичному значению FFFFFFFF .

Предполагая ширину в 32 бит для целого числа.

+0

Отличное объяснение! Спасибо :) –

3

От 'человека 3 Printf':

D, I ИНТ аргумент преобразуется в знаковые децимал

Таким образом, хотя тип ui является unsigned int, printf интерпретирует это как a signed int и показывая его как таковой.

+0

О да! я понял :) –

2

Это потому, что вы используете спецификатор формата %d, который говорит printf, чтобы обрабатывать ваш номер как целое число со знаком. Попробуйте использовать %u для вывода значения без знака и получите желаемый результат.

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

int main() 
{ 
    unsigned int ui; 
    ui = UINT_MAX; 
    ui ++; 
    printf("ui = %u", ui); 
    ui = 0; 
    ui --; 
    printf("\n"); 
    printf("ui = %u", ui); 
    return EXIT_SUCCESS; 
} 

выход:

ui = 0 
ui = 4294967295 

Отъезд в reference возможных спецификаторов формата.

2

printf("%u") следует использовать для unsigned int s.

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