LINUX.ORG.RU

История изменений

Исправление i-rinat, (текущая версия) :

А причём тут printf?

Я там увидел %i, который для int, а передавался туда int16_t.

Тут дело в том, что результат операций с 32-х битными операндами без приведения типа присваивается 64-х битному результату.

А там разве не ожидаемый результат?

Подправил код, чтобы -Wall ругалось на несоответствие типов, так видно, какой тип имеет выражение:

#include <stdio.h>
#include <inttypes.h>

void a(void) {
  uint32_t a = 10, b = 11;
  printf("%f", a - b);
}
void b(void) {
  uint8_t a = 10, b = 11;
  printf("%f", a - b);
}
int main(void) { a(); b(); return 0; }

q.c: In function ‘a’:
q.c:6:12: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘uint32_t {aka unsigned int}’ [-Wformat=]
   printf("%f", a - b);
            ^
q.c: In function ‘b’:
q.c:10:12: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
   printf("%f", a - b);
            ^

Суть — в type promotion. uint32_t уже имеет такой же размер в битах, что и int, поэтому остаётся как есть. uint8_t повышается до int. Это в описании языка есть, разве нет?

Исправление i-rinat, :

А причём тут printf?

Я там увидел %i, который для int, а передавался туда int16_t.

Тут дело в том, что результат операций с 32-х битными операндами без приведения типа присваивается 64-х битному результату.

А там разве не ожидаемый результат?

Подправил код, чтобы -Wall ругалось на несоответствие типов, так видно, какой тип имеет выражение:

#include <stdio.h>
#include <inttypes.h>

void a(void) {
  uint32_t a = 10, b = 11;
  printf("%f", a - b);
}
void b(void) {
  uint8_t a = 10, b = 11;
  printf("%f", a - b);
}
int main(void) { a(); b(); return 0; }

q.c: In function ‘a’:
q.c:6:12: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘uint32_t {aka unsigned int}’ [-Wformat=]
   printf("%f", a - b);
            ^
q.c: In function ‘b’:
q.c:10:12: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
   printf("%f", a - b);
            ^

Исходная версия i-rinat, :

А причём тут printf?

Я там увидел %i, который для int, а передавался туда int16_t.

Тут дело в том, что результат операций с 32-х битными операндами без приведения типа присваивается 64-х битному результату.

А там разве не ожидаемый результат?