Почему int так работает? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

1. Задача:

Обычно под переменную типа int отводится 4 байта. Определите (узнайте, вспомните) максимально и минимально возможные значения для переменных такого типа. Объявите в программе переменную max типа int и присвойте ей значение на единицу больше максимально допустимого. Запрограммируйте вывод значения переменной на экран. Скомпилируйте программу и запустите. Чему равна переменная?

Почему?

Моё решение:
#include <stdio.h>
#include <conio.h>
main() {
int max = 2147483648;
printf ("%d" , max);
     getch();
     }
Я не понимаю почему результат работы программы "-2147483648" и это собственно говоря и есть мой вопрос. Я понимаю, что в одном байте 8 бит и в 1 байт можно записать 2^8 (256) разных вариантов комбинаций восьмистроковых единичек и ноликов, поэтому максимальное знаечение int может быть 2^32 т.к. оно 4-рех битное. Соответственно диапазон чисел с которым можно работать в int - от -2147483648 до 2147483647, либо от 0 до 4294967295 если не брать отрицательные числа. Я пробовал увеличивать max на два. Результат "-2147483647", увеличил на 3 - результат "-2147483646". Почему так происходит? И почему когда я присваиваю max значение 4294967295 то получаю в результате -1 ?

Решение задачи: «Почему int так работает?»

textual
Листинг программы
#include <stdio.h>
#include <limits.h>
void printb(int x){
    int i;
 
    for ( i=sizeof(x)*8-1;i>=0;--i)
        printf ("%d",x>>i&1);
}
 
int main() {
    int max = INT_MAX;
    int min = INT_MIN;
    printf ("max=%d\nmin=%d\n" , max, min);
    printf ("hex_max=%x\nhex_min=%x\n",max, min);
    printf("\n");
    printb(max);
    printf("\n");
    printb(min);
    printf("\n");
    return 0;
}

Объяснение кода листинга программы

Вывод программы:

  1. max=2147483647
  2. min=-2147483648
  3. hex_max=7fffffff
  4. hex_min=-7fffffff
  5. 2147483647
  6. 1701311624
  7. 880730429
  8. 440365214
  9. 220182607
  10. 110091303
  11. 550045611
  12. 275170255
  13. 137585127
  14. 68792563
  15. 343962815
  16. 171981407
  17. 859907035
  18. 429953517
  19. 214976759
  20. 107488379 Объяснение кода:
  21. В функции printb используется оператор сдвига >> для сдвига битов числа x вправо на определенное количество позиций i.
  22. Результат сдвига (x>>i) затем применяется к оператору логического И (&1), что приводит к тому, что в каждой итерации цикла выводится либо 0, либо 1.
  23. В функции main определяются две константы max и min, которые представляют максимальное и минимальное значения, которые может хранить целочисленный тип данных.
  24. Затем выводятся в консоль значения max и min в десятичном и шестнадцатеричном форматах.
  25. После этого функция printb вызывается дважды, сначала с аргументом max, а затем с аргументом min.
  26. Вывод функции printb представляет собой двоичное представление числа, где каждая цифра выводится в отдельной строке.

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы