Почему 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=2147483647min=-2147483648hex_max=7fffffffhex_min=-7fffffff2147483647170131162488073042944036521422018260711009130355004561127517025513758512768792563343962815171981407859907035429953517214976759107488379Объяснение кода:- В функции
printbиспользуется оператор сдвига>>для сдвига битов числаxвправо на определенное количество позицийi. - Результат сдвига (
x>>i) затем применяется к оператору логического И (&1), что приводит к тому, что в каждой итерации цикла выводится либо 0, либо 1. - В функции
mainопределяются две константыmaxиmin, которые представляют максимальное и минимальное значения, которые может хранить целочисленный тип данных. - Затем выводятся в консоль значения
maxиminв десятичном и шестнадцатеричном форматах. - После этого функция
printbвызывается дважды, сначала с аргументомmax, а затем с аргументомmin. - Вывод функции
printbпредставляет собой двоичное представление числа, где каждая цифра выводится в отдельной строке.