2015-05-12 4 views
0

У меня возникает следующая проблема при печати неподписанных чисел. Вот что происходит: Когда я ввожу отрицательное значение в массив и затем пытаюсь его распечатать, я не могу напечатать номер, но будет напечатано другое количество.printf not printing unsigned int

int cant; 
int a[30][30];  

int printequation(){ 
    int x,y; 
    for (x=0;x<cant;x++){ 
     for (y=0;y<cant+1;y++){ 
      if(y==cant){ 
       printf(" = %d",a[x][y]); 
      }else{ 
       if (y==0) 
        printf(" %dX%d",a[x][y],(y+1)); 
       else{ 
        if(a[x][y]>0){ 
         printf(" + "); 
        }else{ 
         printf(" - "); 
        } 
        printf("%uX%d",a[x][y],(y+1)); /*<-----------------here*/ 
       } 
      } 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

Вот пример:

input: -2 -2 -2 
output: -2x1 -4294967294x2 = -2 /*here It should print -2 but can't get it*/ 
+2

'а [х] [у]' не является 'беззнаковое int' но' int', вы не можете использовать 'u' спецификатор преобразования , – ouah

+0

Но я использую% u, другой% d предназначен для печати другого номера – user2461687

+0

'a [x] [y]' и '(y + 1)' оба типа 'int', а не' unsigned int'. Почему вы используете '% u'? –

ответ

2

Избегайте смешивания неправильно подобраны printf() спецификаторы формата с типами аргументов. @ouah

//v 
int a[30][30];  
... 
printf("%uX%d",a[x][y],(y+1)); 
//  ^

Для печати подписанную int без его "знак" и работать со всем диапазоном INT_MIN ... INT_MAX, ряд подходов:

  1. Откажитесь INT_MIN и использовать abs()@Keith Thompson

    printf("%d", abs(x)); // fails for 2's complement INT_MIN 
    
  2. Преобразование в более широкое целое число. Не работает, когда более широкое целое число недоступно - редко.

    printf("%lld", llabs((long long) x)); 
    
  3. Преобразовать в соответствующие unsigned. Может быть, проблема на редких машинах, у которых unsigned положительный диапазон такой же, как у int положительного диапазона.

    unsigned u = (unsigned) i; 
    if (i < 0) u = UINT_MAX - u; 
    printf("%u", u); 
    
  4. Печать цифры seprately

    int msdigits = i/10; 
    int lsdigit = i%10; 
    if (msdigits) { 
        printf("%d", abs(msdigits)); 
    } 
    printf("%d", abs(lsdigit)); 
    
+0

Я получаю это: 'неявное объявление функции 'abs'', и я не знаю, почему, я использую функцию abs вне printf, но я не знать, что происходит – user2461687

+0

@ user2461687 Обязательно добавьте '#include ' – chux