Форум программистов, компьютерный форум CyberForum.ru

Диапазон данных - C++

Восстановить пароль Регистрация
 
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
16.09.2012, 10:26     Диапазон данных #1
Я не могу понять одного: short unsigned int j - лежит в диапазоне от 0-65535 => на экран выводится 60000 (по условиям задачи), а short int i - лежит в диапазоне от -32768-32767, но на экран выводится -5536. Вопрос: почему не выводится 32767, а выводится 5536?

Сам код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    short int i;
    short unsigned int j;
 
    j=60000;
    i=j;
    cout << i << " " << j;
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2012, 10:26     Диапазон данных
Посмотрите здесь:

C++ Диапазон
Диапазон вывода C++
Диапазон значений C++
диапазон инта C++
C++ Диапазон значений указателей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.09.2012, 10:48     Диапазон данных #2
Потому что так неявно преобразуются типы.
60000 — константа-литерал типа int, в двоичном виде она представляется так:
00000000 00000000 11101010 01100000
Потом её насильно приводят к типу unsigned short int (который у j). То есть отбрасывают первые два байтика:
11101010 01100000
Потом это приводится к типу (signed) short int (который у i).

Так как размеры одинаковые, то ничего не делается. Никаких округлений до максимума, никаких учётов знаков и т. п. Как было в памяти, так и осталось:
11101010 01100000
Это Си++ и наследние Си, который является просто продвинутым ассемблером.

Вот только теперь это знаковое число. В старшем бите единичка, значит, это отрицательное число. Отнимаем единицу, обращаем биты, получаем:
00010101 10100000
А это и есть 5536. То есть –5536.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
16.09.2012, 11:19  [ТС]     Диапазон данных #3
1). Как вы узнали что
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
00000000 00000000 11101010 01100000
именно будет выглядеть так в двоичном виде(я в инженерном калькуляторе подставил 60000 и у меня получилось только 11101010 01100000)?

2). Почему именно двоичный вид(я мало имею представления что это и как, но почему именно он, а не какой-либо другой)?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.09.2012, 12:37     Диапазон данных #4
Куркулятор не показывает бесполезные ведущие нули. Я их оставил, чтобы показать, что 60000 — это константа типа int (32 бита). Но это не особо важно.

Двоичный вид, потому что в памяти компьютера числа представляются в двоичном виде. Именно поэтому результат приведения беззнакового числа 60000 к знаковому числу той же разрядности именно такой, какой он есть.
warchief
 Аватар для warchief
36 / 36 / 3
Регистрация: 09.08.2012
Сообщений: 114
16.09.2012, 13:36     Диапазон данных #5
А еще это можно объяснить проще (но при этом некорректно, на собеседованиях так не стоит отвечать ).
Когда входящее значение превышает максимально возможное, переменная так сказать обнуляется, то есть отчет начинается от самого минимального числа, к которому прибавляет остаток сверх лимита.

То есть получилось так. 32767 - максимально возможное число. Введено 60000. 60000 - 32767 = 27233 это остаток. Минимально возможное число -32768. Так как мы превысили лимит, то переменная обнулилась и условно равна -32768 (условно, потому что я рассуждаю а не описываю ход выполнения кода). Теперь к этой переменной прибавляем остаток -32768 + 27233 = -5535.

Как-то вот так... Вот а теперь и надо разбирать в байтах этот процесс И где-то я слышал что это вообщем-то возможно машинозависимо
Yandex
Объявления
16.09.2012, 13:36     Диапазон данных
Ответ Создать тему
Опции темы

Текущее время: 17:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru