История изменений
Исправление 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-х битному результату.
А там разве не ожидаемый результат?