Почему 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
представляет собой двоичное представление числа, где каждая цифра выводится в отдельной строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д