Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение размера типа в байтах 
:(
    Опции темы
Compositum
Дата 11.5.2011, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



  В своём справочнике по С, Шилдт пишет, что стандартами C89 и C99 определены минимально допустимые диапазоны значений для базовых типов. Т.е. диапазоны могут быть и больше. Например, у меня 64-х разрядный процессор + 64-битная операционная система, в свете чего я предполагаю, что в моём случае минимально допустимый диапазон может существенно отличаться от указанного Шилдтом... 
  Как в C программно определить потенциально допустимые (учитывая только архитектуру компьютера) диапазоны значений для базовых типов на текущей локальной машине, а так же фактически допустимые диапазоны значений (учитывая архитектуру компьютера + разрядность ОС) ?

Это сообщение отредактировал(а) Compositum - 11.5.2011, 07:35
PM   Вверх
Compositum
Дата 11.5.2011, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Вопрос снят, т.к. в гугле нашел ответ - sizeof().
Написал такой код:
Код

#include<stdio.h>

main()
{
    printf ("char: %ld\n", sizeof(char));
    printf ("int: %ld\n", sizeof(int));
    printf ("long int: %ld\n", sizeof(long int));
    printf ("float: %ld\n", sizeof(float));
    printf ("double: %ld\n", sizeof(double));
    printf ("long double: %ld\n", sizeof(long double));
}


Результат получился таким (размеры, как я понял - в байтах):
Цитата

bush@mycomp:~/Training/C/C89/Ritchi/1/1.5.2$ gcc sizes.c -o sizes.out
bush@mycomp:~/Training/C/C89/Ritchi/1/1.5.2$ ./sizes.out
char: 1
int: 4
long int: 8
float: 4
double: 8
long double: 16

в моём случае long double существенно отличается от значения, указанного Шильдтом в справочнике - 16 байт вместо 10.
В общем - выяснил то, что хотел smile

Это сообщение отредактировал(а) Compositum - 11.5.2011, 08:15
PM   Вверх
bsa
Дата 11.5.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



sizeof возвращает размер в char'ах. char - это минимально адресуемый объем данных. Именно поэтому, sizeof(char) всегда равен 1.
PM   Вверх
Compositum
Дата 11.5.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(bsa @ 11.5.2011,  17:20)
sizeof возвращает размер в char'ах. char - это минимально адресуемый объем данных. Именно поэтому, sizeof(char) всегда равен 1.

а как тогда программно узнать размер char в байтах? 
PM   Вверх
borisbn
Дата 11.5.2011, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bsa @  11.5.2011,  17:20 Найти цитируемый пост)
sizeof возвращает размер в char'ах

Цитата
N1905=05-0165
5.3.3 Sizeof
The sizeof operator yields the number of bytes in the object representation of its operand

Цитата(Compositum @  11.5.2011,  17:39 Найти цитируемый пост)
а как тогда программно узнать размер char в байтах? 

зачем программно, если (оттуда же)
Цитата

... sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1. 


Добавлено через 5 минут и 20 секунд
Цитата(Compositum @  11.5.2011,  07:29 Найти цитируемый пост)
Например, у меня 64-х разрядный процессор + 64-битная операционная система


Цитата(Compositum @  11.5.2011,  07:59 Найти цитируемый пост)

bush@mycomp:~/Training/C/C89/Ritchi/1/1.5.2$ gcc sizes.c -o sizes.out
bush@mycomp:~/Training/C/C89/Ritchi/1/1.5.2$ ./sizes.out
char: 1
int: 4
long int: 8
float: 4
double: 8
long double: 16

хммм. должен быть 8. и ещё: ты самое интересное не вывел - sizeof( void* )

Это сообщение отредактировал(а) borisbn - 11.5.2011, 17:48


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 11.5.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



спасибо! понятно, тогда вопрос отпадает, раз размер всё же в байтах. 

п.с. Жаль, что в своей книге Керниган и Ритчи не рассматривают вопросы локализации и работу с расширенными символами (в приложении так и пишут, мол эту тему опускаем)...
PM   Вверх
500mhz
Дата 11.5.2011, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Цитата

указанного Шильдтом в справочнике - 16 байт вместо 10.

это где такое было? 10 байт


--------------------

PM MAIL ICQ   Вверх
Compositum
Дата 11.5.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 11.5.2011,  17:47)
хммм. должен быть 8. и ещё: ты самое интересное не вывел - sizeof( void* )

возможно дело в том, что у меня процессор Core I7 (т.е. архитектура процессора - x64) + Ubuntu 11.04 x64.
Приду домой - добавлю строку и для void*, а почему знак умножения?

Добавлено @ 17:59
Цитата(500mhz @ 11.5.2011,  17:55)
Цитата

указанного Шильдтом в справочнике - 16 байт вместо 10.

это где такое было? 10 байт

Справочник по С, автор Шильдт (издание, если не изменяет память - 4-е, изложены полностью C89 и C99).  Если нужен номер страницы - домой приду, сообщу (книги под рукой сейчас нет).

Да, точно 4-е, вот она.

Это сообщение отредактировал(а) Compositum - 11.5.2011, 18:05
PM   Вверх
500mhz
Дата 11.5.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



а может 0х10 ?


--------------------

PM MAIL ICQ   Вверх
Compositum
Дата 11.5.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(500mhz @ 11.5.2011,  18:03)
а может 0х10 ?

я сейчас уже ухожу с работы. через полтора часа буду дома - проверю ещё раз и отпишусь.
PM   Вверх
Compositum
Дата 11.5.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Проверил (стр 45): 80 бит. Соответственно 10 байт, как я и писал.
PM   Вверх
Dem_max
Дата 11.5.2011, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



старые досовские компиляторы выдавали sizeof(int) = 2 байта, так как на x86 была адресация в 16 бит.
не удивлюсь если книженция старая то могла быть написана для досовских компиляторов, а там  возможно и 10 байт было. Завтра на работе посмотрю книженцию. 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Compositum
Дата 11.5.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Dem_max @ 11.5.2011,  19:42)
не удивлюсь если книженция старая то могла быть написана для досовских компиляторов, а там  возможно и 10 байт было.

Книга издания 2010 года. 

Цитата(borisbn)

ты самое интересное не вывел - sizeof( void* )

Вывожу:
Цитата

bush@mycomp:~/Training/C/C89/mytests/typeSizes$ gcc sizes.c -o sizes.out
bush@mycomp:~/Training/C/C89/mytests/typeSizes$ ./sizes.out
char: 1
int: 4
long int: 8
float: 4
double: 8
long double: 16
void*: 8


PM   Вверх
500mhz
Дата 11.5.2011, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



да ну не может быт 10 байт, там все кратно. а 10 никуда не лезет.

Добавлено через 10 минут и 9 секунд
http://en.wikipedia.org/wiki/C_variable_ty...nd_declarations


--------------------

PM MAIL ICQ   Вверх
Compositum
Дата 11.5.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(500mhz @ 11.5.2011,  19:54)
да ну не может быт 10 байт, там все кратно. а 10 никуда не лезет.

Добавлено @ 20:04
http://en.wikipedia.org/wiki/C_variable_ty...nd_declarations

Я видел, это в вики. Давайте условимся, что это последний раз, когда я фотографирую книжку - тынц. Таблица 2.1. последняя запись (long double).  Возможно в книге опечатка - за что купил, за то и продаю.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1040 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.