2015-09-29 2 views
0

Мне любопытно, почему следующий код возвращает отрицательные числа, хотя каждая отдельная инициализация переменной и fuction в этой программе представляет собой unsigned int. Я думал, они всегда должны были быть позитивными?Указатели игнорируют неподписанный признак в C?

#include <stdio.h> 

unsigned int main() 
{ 
unsigned int ch = 0; 
unsigned int asteriskValue = 0; 
while(ch!=27) 
{ 
    ch = getch(); 
     if (ch == 224) 
     { 
      increaseDecrease(&asteriskValue); 
     } 
    printf("%d",asteriskValue); 
} 
} 

void increaseDecrease(unsigned int *value) 
{ 
unsigned int upOrDown; 
upOrDown = getch(); 
if(upOrDown == 72) 
    (*value)--; 
else if(upOrDown == 80) 
    (*value)++; 
} 
+0

Целые числа без знака являются не только положительными, но также могут быть '0'. Использование Неправильный формат-спецификатор вызывает неопределенное поведение. – Olaf

+0

'unsigned' не является признаком, а спецификатором типа. C не поддерживает признаки. – Olaf

ответ

1

Я думаю, что ваши результаты действительно положительное значение, но печать его с флагом «% D», рассказывает PRINTF интерпретировать его как знаковое значение, как если бы вы были кастинг на лета типа: () asteriskValue

Попробуйте напечатать его с помощью «% u» вместо «% d».

+0

Хорошо, спасибо большое! но если я не напечатаю значение и использую его для вычисления значения (*), все равно уменьшает значение asteriskValue до -1. Как я могу заставить его оставаться неподписанным, похожим на const с переменными? –

+0

На самом деле, у вас никогда не будет -1, он станет 65535 (например, если ваш в 16 бит), но напечатав его как подписанный, вы забудете, что у вас есть -1 ... –

+0

Вы нашли но не правильное обоснование. printf не передает свои аргументы, он даже не знает, что это такое. Если вы используете неправильный спецификатор формата, это просто неопределенное поведение. –

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