Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2011, 11:50   #1
Tricko
 
Регистрация: 26.06.2011
Сообщений: 7
По умолчанию Не могу понять работу двух модификаторах типов

Добрый день форумчанам!Изучая модификаторы типов,столкнулся с проблемой:
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	short int i;
	short unsigned j;

	j = 60000;
	i = j;
	cout << i << " " << j; //здесь на экран выводится -5536 и 60000
	system("pause");
	return 0;
}
Вопрос вот в чем:так как переменная i имеет модфикаторы unsigned short ,то почему,после вывода на экран,программа пишет число (-5536),а не 32767?Ведь максимальное значение short int - 32767,получается
она должна выводить на экран число 32767.Буду очень признателен за помощь!
Tricko вне форума Ответить с цитированием
Старый 08.07.2011, 12:09   #2
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Tricko Посмотреть сообщение
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	short int i;
	short unsigned j;

	j = 60000;
	i = j;
	cout << i << " " << j; //здесь на экран выводится -5536 и 60000
	system("pause");
	return 0;
}
Где же она (i) имеет модификатор unsigned short?
Dogmat вне форума Ответить с цитированием
Старый 08.07.2011, 12:11   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну во первый у вас i, имеет тип signed short.
а во вторых, это просто численное переполнение так называемое.

почитайте, поймете как хранятся числа, и почему так выходит.
http://ru.wikipedia.org/wiki/Дополни...тавление_числа)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.07.2011, 12:15   #4
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

sizeof(short int) == 2 byte;
range == (-32768; 32767)

(60000 - 32767) == 27233
(32769 - 27233) * (-1) == -5536
Dogmat вне форума Ответить с цитированием
Старый 08.07.2011, 12:22   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
i имеет модфикаторы unsigned short
Переменная i имеет только модификатор short.
Цитата:
почему,после вывода на экран,программа пишет число (-5536),а не 32767?
Число 60000 типа unsigned short int представлено в моей системе (x86) (и в вашей, судя по результату тоже) ввиде 01100000 11101010, и т.к. это порядок little-endian (http://ru.wikipedia.org/wiki/Little-endian), то самый старший бит (сдесь - девятый) - единица, а это значит, что приведение к signed short int, которое, кстати, не меняет ничего в представлении числа, как и любое другое целочисленное приведение, а лишь может отбросить или добавить какие-то байты, сделает число отрицательным (уже не 32767), а также равным -5536, которое, как и следовало бы ожидать, представляется в машине так же.
В общем прочитайте как нибудь: http://kuzelenkov.narod.ru/mati/book...m/inform5.html
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 08.07.2011, 12:51   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Товарищи, это не модификаторы, а спецификаторы
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 08.07.2011, 13:12   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Blade
Цитата:
Товарищи, это не модификаторы, а спецификаторы
http://www.cppreference.com/wiki/ru/data_types
Цитата:
Модификаторы типа

Некоторые из перечисленных типов можно модифицировать ключевыми словами signed (знаковый), unsigned (беззнаковый), short (короткий) и long (длинный).
Модификаторы типа: signed, unsigned, long, short.
Квалификаторы доступа: const, valotile.
Спецификаторы хранения: auto, static, register, extern, mutable.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 08.07.2011, 13:55   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
Blade

http://www.cppreference.com/wiki/ru/data_types

Модификаторы типа: signed, unsigned, long, short.
Квалификаторы доступа: const, valotile.
Спецификаторы хранения: auto, static, register, extern, mutable.
Не знаю кто это написал, но пользоваться надо достоверными источниками информации.
http://lib.ru/CTOTOR/kernigan.txt_wi...tures.html#148
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 08.07.2011, 14:23   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще по логике подумав их можно назвать и так и так.(а еще аттрибутом обозвать можно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.07.2011, 14:34   #10
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Не знаю кто это написал, но пользоваться надо достоверными источниками информации.
http://lib.ru/CTOTOR/kernigan.txt_wi...tures.html#148
Герберт Шилдт (http://ru.wikipedia.org/wiki/%D0%A8%...B5%D1%80%D1%82) - Полный справочник по С++ (4 издание), дословно:
Цитата:
Модификация основных типов
За исключением типа void, основные типы данных могут иметь различные модификаторы (modifiers), которые используются для более точной настройки. Вот их список.
signed
unsigned
long
short
И так далее со спецификаторами и квалификаторами, как я написал в прошлом сообщении. Можете ознакомиться - http://depositfiles.com/ru/files/1y6zfvbul. А у вас переводчики накосячили.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу понять... svoi92 Помощь студентам 1 08.02.2011 14:51
Не могу понять spaun88 Общие вопросы Delphi 0 15.04.2010 00:41
Не могу понять Superlotles Помощь студентам 8 31.08.2009 20:39
не могу понять... Dutchman Паскаль, Turbo Pascal, PascalABC.NET 4 14.12.2006 07:14