Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 143
Записей в блоге: 8
1

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

20.07.2013, 22:01. Просмотров 3109. Ответов 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 байта. Тогда в чем же дело?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2013, 22:01
Ответы с готовыми решениями:

типы указателей
Помогите понять, что от меня хотят в этом задании: &quot;выбрать данные из памяти с помощью разных типов...

Не получается преобразовать типы указателей на функцию
Доброго всем времени суток. Подскажите пожалуйста как сделать есть тип указателя на функцию. ...

Размер памяти для указателей имеющих различные типы
Объясните пожалуйста, почему размер памяти выходит разный Перепишите код и вывод на форум

Сериализация указателей на примитивные типы
Прошу пользователей пакета Serialization подсказать, что требуется добавить в код, чтобы можно было...

32
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
20.07.2013, 22:07 2
Цитата Сообщение от dserp18 Посмотреть сообщение
хотя указатель типа int должен вроде бы вмещать 2 байта.
int вроде 4 байта.
0
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
20.07.2013, 22:10 3
Цитата Сообщение от dserp18 Посмотреть сообщение
*lp=12345678
Цитата Сообщение от dserp18 Посмотреть сообщение
но у меня выводится *ip=12345678
помоему ожидание совпадает с действительностью
0
Эксперт С++
4966 / 3072 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
20.07.2013, 22:11 4
В Borland C++ для DOS sizeof( int ) == 2, в компиляторах для Windows sizeof( int ) == 4
0
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 143
Записей в блоге: 8
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
0
Эксперт С++
4966 / 3072 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
20.07.2013, 22:41 6
Потому что в конце ставишь L.
0
Evg
Эксперт CАвтор FAQ
21141 / 8157 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
20.07.2013, 22:53 7
Цитата Сообщение от dserp18 Посмотреть сообщение
хотя указатель типа int должен вроде бы вмещать 2 байта
https://www.cyberforum.ru/blogs/18334/blog69.html

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

C
double L = 123456789.0
в шестнадцатиричной системе тут уже не получится писать
0
Higher
1945 / 1211 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.07.2013, 23:46 8
Цитата Сообщение от dserp18 Посмотреть сообщение
пример из книжки Подбельского
Лучше выбросить ее подальше, автор вообще некомпетентен в с++.
0
2572 / 2188 / 233
Регистрация: 03.07.2012
Сообщений: 7,901
Записей в блоге: 1
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/
0
Каратель
Эксперт С++
6598 / 4019 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.07.2013, 10:36 10
Цитата Сообщение от zer0mail Посмотреть сообщение
По стандарту short не меньше 16 бит, long не меньше 32
цитату из стандарта, м?
0
2572 / 2188 / 233
Регистрация: 03.07.2012
Сообщений: 7,901
Записей в блоге: 1
22.07.2013, 11:04 11
Я прочитал это у Страуструпа (специальное издание, Бином, 2011г, стр 120):
Здесь N может быть char, short int, int или long int. Кроме того, гарантируется, что под char отводится минимум 8 бит,
под short или int — минимум 16 бит, под long — минимум 32 бита.


А Страуструпу я верю
0
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.

0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.07.2013, 14:47 13
Цитата Сообщение от zer0mail Посмотреть сообщение
А Страуструпу я верю
При всем уважении к д-ру Страуструпу, лучше все же верить Стандарту.
А он утверждает следующее:
sizeof(char) == 1
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
0
Evg
Эксперт CАвтор FAQ
21141 / 8157 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
22.07.2013, 16:38 14
Цитата Сообщение от zer0mail Посмотреть сообщение
Кроме того, гарантируется, что под char отводится минимум 8 бит
В стандарте говорится "1 байт", а не "8 бит"
0
What a waste!
1579 / 1279 / 172
Регистрация: 21.04.2012
Сообщений: 2,683
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>
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.07.2013, 17:00 16
Как говорится, открой для себя мир архитектур, отличных от Intel x86, и мир операционных систем, отличных от Windows.....
0
2572 / 2188 / 233
Регистрация: 03.07.2012
Сообщений: 7,901
Записей в блоге: 1
22.07.2013, 17:53 17
Цитата Сообщение от Evg Посмотреть сообщение
В стандарте говорится "1 байт", а не "8 бит"
1. Претензии к Страуструпу (я привел цитату из его книги) или к переводчикам.
2. Жду ссылку, где байт не 8 бит.
0
Don't worry, be happy
16917 / 9794 / 1886
Регистрация: 27.09.2012
Сообщений: 24,283
Записей в блоге: 2
22.07.2013, 18:01 18
Цитата Сообщение от zer0mail Посмотреть сообщение
Жду ссылку, где байт не 8 бит.
В гугле 100500 штук! Наверное, можно иногда и самому поискать, если уж сказали что такое бывает и не верится
0
2572 / 2188 / 233
Регистрация: 03.07.2012
Сообщений: 7,901
Записей в блоге: 1
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
0
Don't worry, be happy
16917 / 9794 / 1886
Регистрация: 27.09.2012
Сообщений: 24,283
Записей в блоге: 2
22.07.2013, 18:18 20
zer0mail, даже в википедии есть примеры )))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2013, 18:18

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

Создать массив указателей на функции к функциям, которые имеют разное число и типы параметров?
Можно ли создать массив указателей на функции к функциям, которые имеют разное число и типы...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...


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

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

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