Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
1

Объясните пожалуйста результат работы программы

28.04.2016, 13:59. Просмотров 997. Ответов 8
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    short int i;
    short unsigned int j;
    
    j = 60000;
    i = j;
    cout << i << " "<< j;
    
    return 0;
}
почему ответ будет : -5536 60000 откуда берется -5536?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2016, 13:59
Ответы с готовыми решениями:

Объясните результат работы следующей программы
double x =1.23456789; for(int i=0; i&lt;1030;i++) x=x/2; for( int i=0; i &lt;1030;i++) x=x*2;...

Объясните пожалуйста ход работы программы
Дан код #include&lt;iostream&gt; #include&lt;windows.h&gt; using namespace std; HANDLE console =...

Объясните пожалуйста код и ход работы программы на С++
Вот код фрагмента программы: int i; int l=strlen(str); int k=strlen(fsubstr); ...

Программа которая выводит два наибольших числа из десяти введенных. Пожалуйста объясните суть работы программы
#include &lt;iostream&gt; using namespace std; int main() { int i; float number,...

8
2655 / 1831 / 548
Регистрация: 05.06.2014
Сообщений: 5,297
28.04.2016, 14:05 2
Лучший ответ Сообщение было отмечено MRG_Serejka как решение

Решение

Цитата Сообщение от MRG_Serejka Посмотреть сообщение
почему ответ будет : -5536 60000 откуда берется -5536?
Арифметическое переполнение - short int у вас может хранить числа от -32768, до 32767. short unsigned int - от нуля до 65535. Когда пихаем второе в первое, число не влезает в допустимые границы и получается глюк.
1
240 / 135 / 52
Регистрация: 23.11.2015
Сообщений: 392
28.04.2016, 14:15 3
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
short int i; short unsigned int j;
слово int можно безболезненно опустить в обоих случаях.

на архитектуре x86 размер шорта равен двум байт, будем исходить из этого.
если использовать эти 2*8=16 бит для хранения положительных чисел, то мы сможем хранить там числа от нуля до 2^16=65536 не включая. если же мы хотим использовать эти биты для хранения числа со знаком, то мы вынуждены потратить один бит на хранение знака. теперь диапазон чисел будет лежать в промежутке [-2^15, 2^15) [-32768, 32768)

so far so good

теперь мы используем это грязное преобразование и пытаемся интерпретировать биты, которые значили 60000 как число со знаком.

60000 = 1110101001100000
первый бит равен единице, значит это число отрицательное и представлено в дополнительном коде, напишем минус, инвертируем все биты и прибавим единичку.
1110101001100000 (invert) 0001010110011111 (plus one) 1010110100000 (to dec) 5536 (dont forget minus)
1
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
28.04.2016, 21:25  [ТС] 4
Спасибо,благодаря вам я понял что вместо short int переменная1, переменная 2 можно просто писать short переменная1, переменная2

По поводу архитектуры не особо понял. Я работаю в 64 битной Ubuntu 16.04 которая установленна на виртуальную машину, а сам я сижу под Windows 10 64 битной. Когда выполняется код программы как я буду понимать для какой среды выполняется моя прорамма, для 16 разрядной или 32 разрядной среды? В моей книге написано что для 16 разрядной среды int может принимать значение от -32768 до 32767, а для 32 разрядной среды int может принимать значение от -2 147 483 648 до 2 147 483 647

Мой процессор AMD Phenom x4 970, т.е. у меня среда x86 или x64 ?
Что значит размер шорта равен двум байт ? типа 1 байт равен 8 бит, поэтому 2 байта это 16 бит да ?

если использовать эти 2*8=16 бит для хранения положительных чисел, то мы сможем хранить там числа от нуля до 2^16=65536 не включая. если же мы хотим использовать эти биты для хранения числа со знаком, то мы вынуждены потратить один бит на хранение знака. теперь диапазон чисел будет лежать в промежутке [-2^15, 2^15) [-32768, 32768)
Что значит числа от нуля до 2^16=65536 не включая ?

т.е. если мы захотим включить возможность использовать отрицательные числа в 16 битном пуле short int, то нам придется из 16 битов один использовать не для хранения числа, а для хранения знака минус. Итого у нас останется 15 битов для хранения цифр. Вот оно что, понятно. И типа 2 в пятьнадцатой степени равно 32768, а ведь short int аналогичен типу int (написано в книге) а тип int имеет значение от -32768 до 32767. А вы скахали "теперь диапазон чисел будет лежать в промежутке [-2^15, 2^15) [-32768, 32768)" Я что то немного запутался.

значит это число отрицательное и представлено в дополнительном коде что значит в дополнительном коде ?

А вот осюда вообще не понятно, напишем минус, инвертируем все биты и прибавим единичку.
1110101001100000 (invert) 0001010110011111 (plus one) 1010110100000 (to dec) 5536 (dont forget minus)


Может мне просто это пока не нужно знать? вроде только на 61 странице, а уже запутался.
Наверное на сегодня мне нужно отдохнуть, голова небось перегрелась от непонимания...
0
2655 / 1831 / 548
Регистрация: 05.06.2014
Сообщений: 5,297
28.04.2016, 23:02 5
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
Когда выполняется код программы как я буду понимать для какой среды выполняется моя прорамма, для 16 разрядной или 32 разрядной среды?
В идеале - никак. Во-первых, если вам нужно явно задать размер числа, то есть int8_t/int16_t/int32_t/int64_t. Во-вторых, 16 разрядные системы похоронили в прошлом веке. Прекратите насиловать труп. Хотя, конечно, если вы программируете микроконтроллер, то там, наверно, и восьмибитовую среду откопать можно.
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
значит это число отрицательное и представлено в дополнительном коде что значит в дополнительном коде ?
Значит, что отрицательное число это такое положительное, только из него надо сначала вычесть 32768. Википедия в помощь.
1
240 / 135 / 52
Регистрация: 23.11.2015
Сообщений: 392
29.04.2016, 08:15 6
MRG_Serejka, ты всегда можешь сделать sizeof(int) и получить количество байт, которые будут выделены для хранения ячейки этого типа. также информация о типе исполняемого файла записана непосредственно в исполняемый файл. в твоей убунте наверняка есть утилита readelf, можешь погуглить.

но это все не очень важно для тебя сейчас, просто используй sizeof и ты узнаешь все, что тебе нужно.
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
Что значит числа от нуля до 2^16=65536 не включая ?
видимо плохо выразился, это просто значит от нуля до 65535. 65536 уже не влезает.
так обычно говорят про промежутки, квадратная скобка включая, круглая - не включая краевые значения.

Цитата Сообщение от MRG_Serejka Посмотреть сообщение
что значит в дополнительном коде ?
есть вот такое хорошее видео для блондинок, в дополнение к википедии, поглядите его
https://youtu.be/lKTsv6iVxV4
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
Я что то немного запутался
в самом начале я сделал допущение, что у нас 32-разрядное приложение и для него int четыре байта, а short - два. так что твоя кніга говоріт о другом немного. http://rextester.com/FEC74971

Добавлено через 4 минуты
в принципе на amd64 размер инта и шорта такой же как и в x86, разве что размеры указателей другие
1
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
03.05.2016, 20:25  [ТС] 7
Renji, Спасибо большое, вы очень хорошо объяснили !!!

Babysitter, За sizeof(int) отдельное спасибо ! Я не сразу понял что означает 4, но потом все же догадался что это байты которые нужно перевести в биты, и оно равно 32 битам, что говорит о 32 разрядной среде где integer равен - 2 147 483 648 до 2 147 483 647)) А видео посмотрю, надеюсь пойму)))))

Добавлено через 2 минуты
Babysitter, а видео на русском нету ?))
0
С чаем беда...
Эксперт CЭксперт С++
7871 / 3797 / 1045
Регистрация: 18.10.2014
Сообщений: 8,065
03.05.2016, 20:45 8
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
что говорит о 32 разрядной среде
Размеры целочисленных (и любых других) типов никак не зависят от среды или процессора - они определяются компилятором и только компилятором. Т.е. какие настройки вы сделаете в компиляторе - такие и получите размеры целочисленных типов.

Разумеется, языки С и С++ по своей природе разрабатывались, как эффективные языки, т.е. языки, которые не занимаются созданием какого-то толстого слоя абстрагирования от окружающей аппаратной и системной среды. Компиляторы С и С++ по этой причине ориентируются на типы, нативно поддерживаемые аппаратурой. Т.е. зависимость от "от среды" есть только косвенная - по линии "здравого смысла". Но формально этого не требуется. Компилятор имеет право реализовать 37-битный тип short int, если ему этого захочется.

В С и С++ результат знакового целочисленного переполнения при преобразовании типов из целого в целое является implementation defined, т.е. определяется реализацией. Т.е. формально за объяснением того, что присходит в вашем примере надо читать документацию вашего компилятора. В рамках абстрактного С и С++ ответа на этот вопрос нет.
1
240 / 135 / 52
Регистрация: 23.11.2015
Сообщений: 392
04.05.2016, 00:05 9
TheCalligrapher, так-то во всем согласен, но тогда уже стоит сказать о том, что существуют "модели данных", которые стандартизированы и приняты как раз в рамках среды разработки. и выбираются они на основе аппаратной архитектуры.

если говорим о 32-разрядной программе(на платформе x86 нативно/на amd64 в режиме совместимости), то и на линуксах и на винде используется модель ILP32LL
int - 32 бита, long - 32 бита, long long - 64 бита, указатель - 32 бита(с)
не достаточно же сказать, что стандарт языка говорит об размере типов, откуда-то они берутся.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2016, 00:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Объясните, пожалуйста, принцип работы.
Есть прога, считает сумму ряда, но ряд - знакочередующийся (-1,1,-1,...). При подсчете программа...

Объясните пожалуйста принцип работы указателей
#include &lt;iostream&gt; using namespace std; int main() { int *p,num; p = &amp;num; ...

Объясните пожалуйста принцип работы кода
Доброго времени суток, объясните пожалуйста принцип работы кода. Это шифровальщик и дешифровальщик...

Объясните пожалуйста работу программы
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; using namespace std; int main(int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.