Почему int так работает? - C (СИ)
Формулировка задачи:
1. Задача:
Я не понимаю почему результат работы программы "-2147483648" и это собственно говоря и есть мой вопрос.
Я понимаю, что в одном байте 8 бит и в 1 байт можно записать 2^8 (256) разных вариантов комбинаций восьмистроковых единичек и ноликов, поэтому максимальное знаечение int может быть 2^32 т.к. оно 4-рех битное. Соответственно диапазон чисел с которым можно работать в int - от -2147483648 до 2147483647, либо от 0 до 4294967295 если не брать отрицательные числа.
Я пробовал увеличивать max на два. Результат "-2147483647", увеличил на 3 - результат "-2147483646". Почему так происходит? И почему когда я присваиваю max значение 4294967295 то получаю в результате -1 ?
Обычно под переменную типа int отводится 4 байта. Определите (узнайте, вспомните) максимально и минимально возможные значения для переменных такого типа. Объявите в программе переменную max типа int и присвойте ей значение на единицу больше максимально допустимого. Запрограммируйте вывод значения переменной на экран. Скомпилируйте программу и запустите. Чему равна переменная?
Почему?
Моё решение:
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- main() {
- int max = 2147483648;
- printf ("%d" , max);
- getch();
- }
Решение задачи: «Почему 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;
- }
Объяснение кода листинга программы
Вывод программы:
max=2147483647
min=-2147483648
hex_max=7fffffff
hex_min=-7fffffff
2147483647
1701311624
880730429
440365214
220182607
110091303
550045611
275170255
137585127
68792563
343962815
171981407
859907035
429953517
214976759
107488379
Объяснение кода:- В функции
printb
используется оператор сдвига>>
для сдвига битов числаx
вправо на определенное количество позицийi
. - Результат сдвига (
x>>i
) затем применяется к оператору логического И (&1
), что приводит к тому, что в каждой итерации цикла выводится либо 0, либо 1. - В функции
main
определяются две константыmax
иmin
, которые представляют максимальное и минимальное значения, которые может хранить целочисленный тип данных. - Затем выводятся в консоль значения
max
иmin
в десятичном и шестнадцатеричном форматах. - После этого функция
printb
вызывается дважды, сначала с аргументомmax
, а затем с аргументомmin
. - Вывод функции
printb
представляет собой двоичное представление числа, где каждая цифра выводится в отдельной строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д