Целочисленное переполнение

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

/* Целочисленное переполнение */
/* Битность определяет диапазон допустимых значений */

int main()
{
    uint8_t byte = 255; /* беззнаковый тип занимат 8 бит в памяти диапазон допустимых значений о 0 до 255*/
    uint16_t byte_2 = 65535; /* беззнаковый тип занимат 16 бит в памяти диапазон допустимых значений о 0 до 65535 */
    uint32_t byte_4 = 4294967295; /* беззнаковый тип занимат 32 бит в памяти диапазон допустимых значений о 0 до  4294967295*/
    uint64_t byte_8 = 18446744073709551615; /* беззнаковый тип занимат 64 бит в памяти диапазон допустимых значений о 0 до  18446744073709551615 */
    /* Байт битность */
    printf("Value of byte = %d\n", byte);
    printf("Value of byte = %d\n", byte += 1);
    printf("\n\n\n");
    /* 2 байта битность 16*/
    printf("Value of byte_2 = %d\n", byte_2);
    printf("Value of byte_2 = %d\n", byte_2 += 1);
    printf("\n\n\n");
    /* 4 байта битность 32 */
    printf("Value of byte_4 = %d\n", byte_4);
    printf("Value of byte_4 = %d\n", byte_4 += 1);
    printf("\n\n\n");
    /* 8 байт биность 64 */
    printf("Value of byte_8 = %d\n", byte_8);
    printf("Value of byte_8 = %d\n", byte_8 += 1);
    printf("\n\n\n");

}

Здравствуйте у меня есть вопрос касаемо целочисленного переполнения. В этой программе я хотел проверить как происходит целочисленное переполнение . Я использую библиотеку inttypes . Первый вопрос почему компилятор выдает следующие предупреждение:

warning: integer constant is so large that it is unsigned

warning: format '%d' expects argument of type 'int', but argument 2 has type 'uint64_t {aka long long unsigned int}' [-Wformat=]|

warning: format '%d' expects argument of type 'int', but argument 2 has type 'uint64_t {aka long long unsigned int}' [-Wformat=]|

Второй вопрос почему при запуске программы значение byte_4 функция printf выводит -1 вместо 4294967295 при том если переменная беззнаковая и является 32 битная. Я хотел чтобы она вывела сначала 4294967295 .

Третий вопрос почему при запуске программы значение byte_8 функция printf выводит -1 вместо 18446744073709551615 при том если переменная беззнаковая и является 64 битная. Я хотел чтобы она вывела сначала 18446744073709551615.


Ответы (1 шт):

Автор решения: Михаил Фленов

Решил нужно было всего лишь поменять спецификаторы формата

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

/* Целочисленное переполнение */
/* Битность определяет диапазон допустимых значений */

int main()
{
    uint8_t byte = 255; /* беззнаковый тип занимат 8 бит в памяти диапазон допустимых значений о 0 до +255*/
    uint16_t byte_2 = 65535; /* беззнаковый тип занимат 16 бит в памяти диапазон допустимых значений о 0 до +65535 */
    uint32_t byte_4 = 4294967295; /* беззнаковый тип занимат 32 бит в памяти диапазон допустимых значений о 0 до  +4294967296*/
    uint64_t byte_8 = 18446744073709551615; /* беззнаковый тип занимат 64 бит в памяти диапазон допустимых значений о 0 до +18446744073709551616 */
    /* Байт битность */
    printf("Value of byte = %hhu\n" , byte);
    printf("Value of byte = %hhu\n", byte += 1);
    printf("Value of byte = %hhu\n", byte -= 1);
    printf("\n\n\n");
    /* 2 байта битность 16*/
    printf("Value of byte_2 = %hu\n", byte_2);
    printf("Value of byte_2 = %hu\n", byte_2 += 1);
    printf("Value of byte_2 = %hu\n", byte_2 -= 1);
    printf("\n\n\n");
    /* 4 байта битность 32 */
    printf("Value of byte_4 = %u\n", byte_4);
    printf("Value of byte_4 = %u\n", byte_4 += 1);
    printf("Value of byte_4 = %u\n", byte_4 -= 1);
    printf("\n\n\n");
    /* 8 байт битность 64 */
    printf("Value of byte_8 = %llu\n", byte_8);
    printf("Value of byte_8 = %llu\n", byte_8 += 1);
    printf("Value of byte_8 = %llu\n", byte_8 -= 1);
    printf("\n\n\n");

}
→ Ссылка