Целочисленное переполнение
#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");
}