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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
dserp18
5 / 5 / 0
Регистрация: 20.01.2013
Сообщений: 79
Записей в блоге: 2
#1

типы указателей Подбельский - C++

20.07.2013, 22:01. Просмотров 1808. Ответов 32
Метки нет (Все метки)

пример из книжки Подбельского
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream.h>
#include <iomanip.h>
int main(){
   unsigned long L=0x12345678L;
   char *cp = (char *) &L;  
   int *ip = (int *) &L;
   long *lp = (long *) &L;
      cout<<hex;
      cout<<"Address L= "<<&L<<"\n"; 
      cout<<"cp= "<<(void *)cp<<"\t"; 
      cout<<"*cp= "<<(int) *cp<<"\n"; 
      cout<<"ip= "<<(void *)ip<<"\t"; 
      cout<<"*ip= "<< *ip<<"\n"; 
      cout<<"lp= "<<(void *)lp<<"\t"; 
      cout<<"*lp= "<<*lp<<"\n"; 
        }
должно выводиться
*cp=78
*ip=5678
*lp=12345678
но у меня выводится *ip=12345678, хотя указатель типа int должен вроде бы вмещать 2 байта. Тогда в чем же дело?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
20.07.2013, 22:07     типы указателей Подбельский #2
Цитата Сообщение от dserp18 Посмотреть сообщение
хотя указатель типа int должен вроде бы вмещать 2 байта.
int вроде 4 байта.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
20.07.2013, 22:10     типы указателей Подбельский #3
Цитата Сообщение от dserp18 Посмотреть сообщение
*lp=12345678
Цитата Сообщение от dserp18 Посмотреть сообщение
но у меня выводится *ip=12345678
помоему ожидание совпадает с действительностью
castaway
Эксперт С++
4872 / 3011 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
20.07.2013, 22:11     типы указателей Подбельский #4
В Borland C++ для DOS sizeof( int ) == 2, в компиляторах для Windows sizeof( int ) == 4
dserp18
5 / 5 / 0
Регистрация: 20.01.2013
Сообщений: 79
Записей в блоге: 2
20.07.2013, 22:40  [ТС]     типы указателей Подбельский #5
нда действительно в моём компиляторе sizeof( int ) == 4. тогда почему я не могу сделать переменную double L= 0x123456789L хотя в моём компиляторе sizeof( double ) == 8. Т.е.
C++
1
2
3
4
5
6
#include <iostream.h>
#include <iomanip.h>
int main(){
   double  L=0x123456789L; 
...
}
компилятор выдает ошибку
integer constant is too large for "long" type
castaway
Эксперт С++
4872 / 3011 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
20.07.2013, 22:41     типы указателей Подбельский #6
Потому что в конце ставишь L.
Evg
Эксперт CАвтор FAQ
17267 / 5521 / 344
Регистрация: 30.03.2009
Сообщений: 15,033
Записей в блоге: 26
20.07.2013, 22:53     типы указателей Подбельский #7
Цитата Сообщение от dserp18 Посмотреть сообщение
хотя указатель типа int должен вроде бы вмещать 2 байта
http://www.cyberforum.ru/blogs/18334/blog69.html

Добавлено через 3 минуты
Цитата Сообщение от dserp18 Посмотреть сообщение
double L=0x123456789L
В этой записи условно два действия. В правой части ты описываешь константу типа long, преобразовываешь её к типу double и только потом записываешь в переменную типа double. Размер long'а на твоём компиляторе, судя по всему, равен 4 байтам, а потому такая константа вылезает за диапазон. Если хочешь задать константу типа double, то нужно к ней хоть какую-то дробную часть приделать

C
double L = 123456789.0
в шестнадцатиричной системе тут уже не получится писать
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.07.2013, 23:46     типы указателей Подбельский #8
Цитата Сообщение от dserp18 Посмотреть сообщение
пример из книжки Подбельского
Лучше выбросить ее подальше, автор вообще некомпетентен в с++.
zer0mail
Заблокирован
21.07.2013, 12:57     типы указателей Подбельский #9
Когда писались некоторые старые книги, в С++ - компиляторах int и int* были 16-ти битными. По стандарту short не меньше 16 бит, long не меньше 32, а int между ними. С другой стороны, int всегда (т.е. лет 40, если учитывать Си) был таким, что вмещал указатель. Поэтому на 16-битных разрядах int был 16, а на 32-битных стал 32 бита. Теперь 64 бита и правило нарушилось. Появились int64, long long (64 бита).
Да и с самим long не все гладко: в большинстве случаев он 32 бита, но иногда 64 (модель данных LP), а в C# и Java всегда 64. Посмотреть размеры типов для разных моделей данных можно здесь: http://okolovich.info/model-dannykh-v-c/
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2013, 10:36     типы указателей Подбельский #10
Цитата Сообщение от zer0mail Посмотреть сообщение
По стандарту short не меньше 16 бит, long не меньше 32
цитату из стандарта, м?
zer0mail
Заблокирован
22.07.2013, 11:04     типы указателей Подбельский #11
Я прочитал это у Страуструпа (специальное издание, Бином, 2011г, стр 120):
Здесь N может быть char, short int, int или long int. Кроме того, гарантируется, что под char отводится минимум 8 бит,
под short или int — минимум 16 бит, под long — минимум 32 бита.


А Страуструпу я верю
Croessmah
22.07.2013, 14:33
  #12

Не по теме:

Jupiter, вот:

There are five standard signed integer types : “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list. There may also be implementation-defined extended signed integer types. The standard and extended signed integer types are collectively called signed integer types. Plain ints have the natural size suggested by thearchitecture of the execution environment; the other signed integer types are provided to meet special needs.

CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
22.07.2013, 14:47     типы указателей Подбельский #13
Цитата Сообщение от zer0mail Посмотреть сообщение
А Страуструпу я верю
При всем уважении к д-ру Страуструпу, лучше все же верить Стандарту.
А он утверждает следующее:
sizeof(char) == 1
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
Evg
Эксперт CАвтор FAQ
17267 / 5521 / 344
Регистрация: 30.03.2009
Сообщений: 15,033
Записей в блоге: 26
22.07.2013, 16:38     типы указателей Подбельский #14
Цитата Сообщение от zer0mail Посмотреть сообщение
Кроме того, гарантируется, что под char отводится минимум 8 бит
В стандарте говорится "1 байт", а не "8 бит"
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
22.07.2013, 16:53     типы указателей Подбельский #15
В С же есть <limits.h>, и там есть минимально возможные значения, напимер
maximum value for an object of type unsigned char
UCHAR_MAX 255 // 28 − 1
т.е. минимум 8 бит
maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 216 − 1
т.е. минимум 16 бит
и т.д.
<climits> включает <limits.h>
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
22.07.2013, 17:00     типы указателей Подбельский #16
Как говорится, открой для себя мир архитектур, отличных от Intel x86, и мир операционных систем, отличных от Windows.....
zer0mail
Заблокирован
22.07.2013, 17:53     типы указателей Подбельский #17
Цитата Сообщение от Evg Посмотреть сообщение
В стандарте говорится "1 байт", а не "8 бит"
1. Претензии к Страуструпу (я привел цитату из его книги) или к переводчикам.
2. Жду ссылку, где байт не 8 бит.
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
22.07.2013, 18:01     типы указателей Подбельский #18
Цитата Сообщение от zer0mail Посмотреть сообщение
Жду ссылку, где байт не 8 бит.
В гугле 100500 штук! Наверное, можно иногда и самому поискать, если уж сказали что такое бывает и не верится
zer0mail
Заблокирован
22.07.2013, 18:10     типы указателей Подбельский #19
3. The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain
any member of the basic execution character set (2.3) and the eight-bit code units of the Unicode UTF-8
encoding form and is composed of a contiguous sequence of bits, the number of which is implementationdefined
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 18:18     типы указателей Подбельский
Еще ссылки по теме:

арифметика указателей C++
C++ Массив указателей
C++ Инициализация указателей
C++ Сравнение указателей
C++ Массивы указателей

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12699 / 7173 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
22.07.2013, 18:18     типы указателей Подбельский #20
zer0mail, даже в википедии есть примеры )))
Yandex
Объявления
22.07.2013, 18:18     типы указателей Подбельский
Ответ Создать тему
Опции темы

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