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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
dserp18
 Аватар для dserp18
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 74
Записей в блоге: 2
20.07.2013, 22:01     типы указателей Подбельский #1
пример из книжки Подбельского
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 байта. Тогда в чем же дело?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,617
Записей в блоге: 1
22.07.2013, 18:25     типы указателей Подбельский #21
Да байт уже давно 8 бит и для тех старых компьютеров (и прочих устройств), у которых минимальная единица хранения была не 8 бит, эту самую единицу сейчас никто "просто" байтом не называет. Для любой памяти сейчас байт = 8 бит (а не 5-6-7-9-...) . Примеры из Википедии - исторические (или дайте ссылку на современные архитектуры, где байт не 8 бит).

Если в магазина указана цена 100 рублей, то это сегодняшних рублей, а не каких-то рублей за последние 100 лет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.07.2013, 18:32     типы указателей Подбельский #22
Цитата Сообщение от zer0mail Посмотреть сообщение
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
Как-то ты видимо не дочитал до конца предложения, где написано "and is composed of a contiguous sequence of bits, the number of which is implementation defined"

Добавлено через 4 минуты
Цитата Сообщение от zer0mail Посмотреть сообщение
Примеры из Википедии - исторические
Какое отношение написанное в википедии имеет к тому, что написано в стандарте про размеры базовых типов?

Цитата Сообщение от zer0mail Посмотреть сообщение
(или дайте ссылку на современные архитектуры, где байт не 8 бит)
Neuro NM6403, Multicore. И ещё много других сигнальных процессоров.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,832
Записей в блоге: 2
Завершенные тесты: 1
22.07.2013, 18:33     типы указателей Подбельский #23
Цитата Сообщение от zer0mail Посмотреть сообщение
то это сегодняшних рублей
ценность которых может различаться в разных местах, хотя рубли одни и те же
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,617
Записей в блоге: 1
22.07.2013, 18:37     типы указателей Подбельский #24
И что - из конца предложения следует, что char может быть меньше 8 бит (ведь претензии были к цитате из Страуструпа "char не менее 8 бит")?

Цитата Сообщение от Croessmah Посмотреть сообщение
ценность которых может различаться в разных местах, хотя рубли одни и те же
Вот именно - рубли одни и же, я об этом а не о ценности (30 лет назад мегабайт памяти имел совсем другую ценность, но байтов содержал столько же).
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.07.2013, 19:27     типы указателей Подбельский #25
Цитата Сообщение от zer0mail Посмотреть сообщение
едь претензии были к цитате из Страуструпа "char не менее 8 бит"
Претензии были к тому, что в стандарте размер типов описывается в байтах, а не битах. Я видел компилятор под сигнальный процессор, в котором sizeof(char)=sizeof(short)=sizeof(int)=1 байт, а 1 байт = 32 бита

Цитата Сообщение от zer0mail Посмотреть сообщение
Кроме того, гарантируется, что под char отводится минимум 8 бит,
под short или int — минимум 16 бит, под long — минимум 32 бита
Насколько я знаю, ничего такого стандарт не говорит

Добавлено через 3 минуты
Точнее, стандарт Си такого не говорит. А стандарт Си++ - хз
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,617
Записей в блоге: 1
22.07.2013, 20:25     типы указателей Подбельский #26
Ладно, пусть стандарт Си не говорит. А Страуструп - говорит. В конце концов мне важна истинность его утверждения, а не то, так ли она оформлена в стандарте (и вообще, оформлена ли она как-то).
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.07.2013, 20:52     типы указателей Подбельский #27
Цитата Сообщение от zer0mail Посмотреть сообщение
А Страуструп - говорит
Если в стандарте Си++ по части размера базовых типов записано то же самое, что и в стандарте Си, значит Страуструп не прав де-юре, хотя с вероятностью 99.99% можно утверждать, что прав де-факто.

Тот факт, что в мире существует множество "кривых" (в понимании "стандартного" программиста) implementation-defined настроек ещё не говорит о том, что нужно заморачиваться и помнить о них. Но тем не менее нужно хотя бы понимать, что такие вещи в природе есть и не утверждать, что дескать размеры типов такие-то. Как минимум потому, что кого-то из начинающих это может ввести в заблуждение
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,617
Записей в блоге: 1
22.07.2013, 21:03     типы указателей Подбельский #28
Согласен - и поэтому считаю, что важнее знать де-факто и не заморачиваться вопросами типа: "а вдруг окажется, что int <16 бит (я же 3 года потратил на доскональное изучение стандарта и знаю, что он этого не запрещает) и тогда моя программа не будет работать?".
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.07.2013, 21:06     типы указателей Подбельский #29
Цитата Сообщение от Evg Посмотреть сообщение
Кроме того, гарантируется, что под char отводится минимум 8 бит,
под short или int — минимум 16 бит, под long — минимум 32 бита
Насколько я знаю, ничего такого стандарт не говорит

Добавлено через 3 минуты
Точнее, стандарт Си такого не говорит. А стандарт Си++ - хз
Ещё как говорят. Оба.

C99: 5.2.4.2.1/1 + пункты про значащие биты целых типов

5.2.4.2.1 Sizes of integer types <limits.h>

The values given below <...> shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.

number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8

<...>

maximum value for an object of type unsigned int
UINT_MAX 65535 // 216 – 1

<...>

maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 232 – 1
C++11: весь 18.3.2 + 18.3.3/2:

(сноски 18.3.2.4/1,4)
Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc

Equivalent to CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, etc.

<...>

18.3.3 C library

2 The contents are the same as the Standard C library header <limits.h>.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
23.07.2013, 09:06     типы указателей Подбельский #30
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
maximum value for an object of type unsigned int
UINT_MAX 65535 // 216 – 1
Тебе это не кажется ересью?

Добавлено через 1 минуту
А... дошло. Реально есть-таки минимальные ограничения

Добавлено через 9 часов 35 минут
Опять-таки чисто на всякий случай. Стандарт оперирует понятиями типа "максимальное значение", но не "битовый размер". Казалось бы, одно вытекает из другого. Но это при условии двоичных битов. Бит может иметь и другую размерность. Ранее уже создавались машины, работающие в троичной системе счисления. Сейчас такие навряд ли есть, но кто их знает. Если в светлом будущем схемотехника уйдёт в квантовую область, то так же есть шансы иметь машины с другой размерностью битов. Понятно, что тут уже на грани фантазий, но тем не менее стандарт в этом месте оперирует именно значениями, а не размерами
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.07.2013, 10:34     типы указателей Подбельский #31
Цитата Сообщение от Evg Посмотреть сообщение
Казалось бы, одно вытекает из другого. Но это при условии двоичных битов. Бит может иметь и другую размерность.
Где-нибудь в другом месте, но не в Сишечке:
6.2.6 Representations of types
6.2.6.1 General

<...>

3 Values stored in unsigned bit-fields and objects of type unsigned char shall be represented using a pure binary notation.40)

4 Values stored in non-bit-field objects of any other object type consist of n × CHAR_BIT bits, where n is the size of an object of that type, in bytes.

<...>
______________

40) A positional representation for integers that uses the binary digits 0 and 1, in which the values represented by successive bits are additive, begin with 1, and are multiplied by successive integral powers of 2, except perhaps the bit with the highest position. (Adapted from the American National Dictionary for Information Processing Systems.) A byte contains CHAR_BIT bits, and the values of type unsigned char range from 0 to 2CHAR_BIT − 1.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
23.07.2013, 13:01     типы указателей Подбельский #32
Мамочки родные... это в каком стандарте записано? В смысле как он закодирован (ISO 9899 и т.п.)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2013, 22:01     типы указателей Подбельский
Еще ссылки по теме:

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? C++
Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.07.2013, 22:01     типы указателей Подбельский #33
Всё тот же C99. Не думаю, что в ANSI C что-то другое.
Yandex
Объявления
23.07.2013, 22:01     типы указателей Подбельский
Ответ Создать тему
Опции темы

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