Я новичок в C-заголовках - stdint.h
и inttypes.h
. Я пробовал код, чтобы понять, как работает uint8_t
. Но, похоже, возникла проблема.
Я объявил 4 uint8_t
целых чисел с граничными значениями 0, 255, 256, -1 соответственно и выполнил некоторые простые арифметические операции над ним. Я сделал это, так как хотел знать, что генерирует ошибки / предупреждения c-компилятор (я использую gcc 5.4.0
в linux). А если нет, мне было интересно узнать, как выглядит результат. Код приведен ниже.
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
int main() {
int a = 10;
printf("%d\n", a++);
printf("%d\n\n", a);
// 8 bit unsigned integer -> range[0, 255]
uint8_t ua81=0, ua82=255, ua83=256, ua84=-1;
printf("--------STDINT.H----uint8_t--DEMO--------\nua81 = %" PRIu8 "\n", ua81);
printf("ua82 = %" PRIu8 "\nua83 = %" PRIu8 "\nua84 = %" PRIu8 "\n\n", ua82, ua83, ua84);
printf("ua81+1 = %" PRIu8 "\nua82-3 = %" PRIu8 "\nua83-4+7 = %" PRIu8 "\nua84-1+20 = %" PRIu8 "\n----------\n\n", ua81+1, ua82-3, ua83-4+7, ua84-1+20);
return 0;
}
Вывод этого кода следующий:
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ vi stdint_h.c
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ gcc -Wall stdint_h.c -o a
stdint_h.c: In function ‘main’:
stdint_h.c:11:33: warning: large integer implicitly truncated to unsigned type [-Woverflow]
uint8_t ua81=0, ua82=255, ua83=256, ua84=-1;
^
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ ./a
10
11
--------STDINT.H----uint8_t--DEMO--------
ua81 = 0
ua82 = 255
ua83 = 0
ua84 = 255
ua81+1 = 1
ua82-3 = 252
ua83-4+7 = 3
ua84-1+20 = 274
----------
Как упоминалось ранее, я использую Linux-машину для этого с компилятором gcc 5.4.0
.
vagrant@ubuntu-xenial:~/Documents/Coding Practice/p_c$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Я не могу понять, почему для переменной ua84
значение не переходит на 0
после достижения 255
, в то время как то же самое работает для ua83
. Я думаю, что значение, учитывая опрокидывание после 255, ua84
должно было быть 18
.
Мне кажется, это как-то связано с неявным усечением , упомянутым в warning
, который был сгенерирован для переменной ua83
во время компиляции. Я не знаю точно, что не так с этим. Я также хотел бы знать, как поступить так, что я все еще хочу продолжать использовать uint8_t
.