15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
|
||||||
1 | ||||||
Объясните пожалуйста результат работы программы28.04.2016, 13:59. Показов 1649. Ответов 8
Метки нет (Все метки)
0
|
28.04.2016, 13:59 | |
Ответы с готовыми решениями:
8
Объясните результат работы следующей программы Объясните пожалуйста ход работы программы Объясните пожалуйста код и ход работы программы на С++ Программа которая выводит два наибольших числа из десяти введенных. Пожалуйста объясните суть работы программы |
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
28.04.2016, 14:05 | 2 |
Сообщение было отмечено MRG_Serejka как решение
Решение
Арифметическое переполнение - short int у вас может хранить числа от -32768, до 32767. short unsigned int - от нуля до 65535. Когда пихаем второе в первое, число не влезает в допустимые границы и получается глюк.
1
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
28.04.2016, 14:15 | 3 |
слово 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
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
28.04.2016, 23:02 | 5 |
В идеале - никак. Во-первых, если вам нужно явно задать размер числа, то есть int8_t/int16_t/int32_t/int64_t. Во-вторых, 16 разрядные системы похоронили в прошлом веке. Прекратите насиловать труп. Хотя, конечно, если вы программируете микроконтроллер, то там, наверно, и восьмибитовую среду откопать можно.
Значит, что отрицательное число это такое положительное, только из него надо сначала вычесть 32768. Википедия в помощь.
1
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
29.04.2016, 08:15 | 6 |
MRG_Serejka, ты всегда можешь сделать sizeof(int) и получить количество байт, которые будут выделены для хранения ячейки этого типа. также информация о типе исполняемого файла записана непосредственно в исполняемый файл. в твоей убунте наверняка есть утилита readelf, можешь погуглить.
но это все не очень важно для тебя сейчас, просто используй sizeof и ты узнаешь все, что тебе нужно. видимо плохо выразился, это просто значит от нуля до 65535. 65536 уже не влезает. так обычно говорят про промежутки, квадратная скобка включая, круглая - не включая краевые значения. есть вот такое хорошее видео для блондинок, в дополнение к википедии, поглядите его https://youtu.be/lKTsv6iVxV4 в самом начале я сделал допущение, что у нас 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
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,061
|
|
03.05.2016, 20:45 | 8 |
Размеры целочисленных (и любых других) типов никак не зависят от среды или процессора - они определяются компилятором и только компилятором. Т.е. какие настройки вы сделаете в компиляторе - такие и получите размеры целочисленных типов.
Разумеется, языки С и С++ по своей природе разрабатывались, как эффективные языки, т.е. языки, которые не занимаются созданием какого-то толстого слоя абстрагирования от окружающей аппаратной и системной среды. Компиляторы С и С++ по этой причине ориентируются на типы, нативно поддерживаемые аппаратурой. Т.е. зависимость от "от среды" есть только косвенная - по линии "здравого смысла". Но формально этого не требуется. Компилятор имеет право реализовать 37-битный тип short int , если ему этого захочется.В С и С++ результат знакового целочисленного переполнения при преобразовании типов из целого в целое является implementation defined, т.е. определяется реализацией. Т.е. формально за объяснением того, что присходит в вашем примере надо читать документацию вашего компилятора. В рамках абстрактного С и С++ ответа на этот вопрос нет.
1
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
04.05.2016, 00:05 | 9 |
TheCalligrapher, так-то во всем согласен, но тогда уже стоит сказать о том, что существуют "модели данных", которые стандартизированы и приняты как раз в рамках среды разработки. и выбираются они на основе аппаратной архитектуры.
если говорим о 32-разрядной программе(на платформе x86 нативно/на amd64 в режиме совместимости), то и на линуксах и на винде используется модель ILP32LL int - 32 бита, long - 32 бита, long long - 64 бита, указатель - 32 бита(с) не достаточно же сказать, что стандарт языка говорит об размере типов, откуда-то они берутся.
1
|
04.05.2016, 00:05 | |
04.05.2016, 00:05 | |
Помогаю со студенческими работами здесь
9
Объясните, пожалуйста, принцип работы. Объясните пожалуйста принцип работы указателей Объясните пожалуйста принцип работы кода Объясните пожалуйста работу программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |