65 / 3 / 0
Регистрация: 01.07.2014
Сообщений: 38
1

Почему int так работает?

03.07.2014, 23:06. Показов 2543. Ответов 6
Метки нет (Все метки)

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


Моё решение:
C++
1
2
3
4
5
6
7
#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 ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2014, 23:06
Ответы с готовыми решениями:

Почему код так работает?
Всем привет!!! не могу понять смысл кода и почему он так себя ведет printf(&quot;%d&quot;, (int*)20 + 56);...

Почему malloc работает не так, как ожидается?
int main() { int* p =malloc(sizeof(int)); p=5; printf(&quot;%s\n&quot;,strerror(errno)); ...

Почему работает не так как надо?
В общем вот в чем вопрос, есть код на СИ. Задача такова ввести с клавы день, месяц, год рождения...

Программа с int работает, а с char не работает
Переменная типа int #include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; typedef struct sp...

6
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
03.07.2014, 23:16 2
Лучший ответ Сообщение было отмечено ildwine как решение

Решение

dleen, А Вы посмотрите HEX значения до и после операций. Это переполнение разрядной сетки.
0
Эксперт PHP
4845 / 3857 / 1599
Регистрация: 24.04.2014
Сообщений: 11,316
03.07.2014, 23:57 3
dleen, для простоты на примере 1-байтовых чисел
целые числа со знаком представляются так. для положительных: первый бит 0, остальные 7 - число в 2 системе счисления.
например 5 будет представлено так: 0000 0101. Максимально возможное число получится 0111 1111, т.е. 127

отрицательные числа: сначала модуль числа записывается в двоичной системе, затем все биты инвертируются и прибавляется 1. это делается для устранения двойного нуля. для числа -5 запись будет такая: 5 = 0000 0101. после инверсии: 1111 1010. и +1 -5 = 1111 1011. минимально возможное число: 1000 0000 = -128

теперь что произойдет если к 127 + 1. для компьютера нет никакой разницы знаковые числа или беззнаковые, для него это просто набор бит, вычислит он это так: 0111 1111 + 1 = 1000 000. Если интерпретировать данный результат как знаковое число, то получится -128
2
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
04.07.2014, 00:33 4
Лучший ответ Сообщение было отмечено ildwine как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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;
}
0
65 / 3 / 0
Регистрация: 01.07.2014
Сообщений: 38
04.07.2014, 18:55  [ТС] 5
Jewbacabra, спасибо! Теперь понял.
0
Модератор
Эксперт по электронике
8808 / 6591 / 894
Регистрация: 14.02.2011
Сообщений: 23,173
04.07.2014, 19:11 6
Цитата Сообщение от dleen Посмотреть сообщение
Обычно под переменную типа int отводится 4 байта.
зависит от системы есть и 2 байта и 4 и 8
Цитата Сообщение от dleen Посмотреть сообщение
Определите (узнайте, вспомните)
максимально и минимально возможные значения для переменных такого типа.
ну в свете того что тебе объяснили
есть 2 типа int знаковый и беззнаковый
у безнакового максимальное значение это когда все биты в 1 ( для знакового это же значение -1)

для знакового максимальное это все биты, кроме старшего(знаковый бит) установлены в 1

вот пример который сработает на любых размерах int, числа правда будут разные

C++
1
2
3
4
unsigned int uMax=(unsigned int)-1;
unsigned uMin=0;
 int sMax=uMax>>1;// uMax/2;
int sMin=sMax+1;
Добавлено через 2 минуты
Цитата Сообщение от Jewbacabra Посмотреть сообщение
это делается для устранения двойного нуля.
это делается чтобы в сумме был 0 т.н дополнительный код
например
-1+1=0
11111111+1=0
1
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
06.07.2014, 10:13 7
Цитата Сообщение от dleen Посмотреть сообщение
Определите (узнайте, вспомните)
Преподавателя - на мыло. Чему он детей учит? ВСПОМИНАТЬ??? Программист должен думать, а не заучивать тупо. Пусть компьютер помнит - у него голова большая.

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>      // printf
#include <limits.h>     // INT_MAX
 
#define debug(x)    printf(#x" = %d\n", x)
 
int main(void)
{
    int max = INT_MAX;
    debug(max);
    debug(++max);
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2014, 10:13
Помогаю со студенческими работами здесь

Пояснить, почему переменная объявляется как int
При чтении книги &quot;Язык программирования С&quot; (2-е издание) Кернигана и Ритчи у меня возник ряд...

Почему выводит все нули? int или double
#include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() {int a,i,n; scanf(&quot;%d&quot;, &amp;n); for(i=1; i&lt;=n;...

Почему переменной типа int можно присвоить символьный элемент?
До сих пор не могу понять, почему переменной типа int в Си можно присвоить символьный элемент? Она...

Почему функция scanf() считывает несколько целых чисел только с int?
Привет всем, я абсолютный новичок в программировании и мне не понятно, почему функция scanf() при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru