|
Как стандартно в Си узнать размер char-а, А соответственно и функции sizeof() |
|
|
|
 |
Ответов
|
Aug 20 2009, 20:33
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(GetSmart @ Aug 20 2009, 20:24)  Вопрос: как стандартными методами преобразовать этот размер в байтовый размер, то бишь метод должен одинаково работать на всех платформах, и там где sizeof() байтовый. Код #include <limits.h>
#define CHAR_BYTES (CHAR_BIT / 8) Тьху, позор, срочно исправил на более приличный вариантНу если запараноиться на всякие 9-ти битовые char, то, конечно, посложнее надефайнить придётся, а так - размер в битах (и куча другого полезного) лежит в этом самом limits.h Цитата(Axel @ Aug 20 2009, 22:40)  int true_size = SIZE_OF_CHAR * sizeof(char);
хотя смотрится это не вот уж... Код #define BYTESOF(a) (CHAR_BYTES * sizeof(a))
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 21 2009, 04:13
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(GetSmart @ Aug 21 2009, 10:59)  Мне тут SM подсказывает, что sizeof() по стандарту должен выдавать размер как раз в char-ах. Вопрос: так ли это на самом деле? Насколько помню, sizeof возвращает размер в минимально адресуемых единицах на данной платформе. И "байтом" обычно эту минимально адресуемую ячейку памяти и называют, другими словами, на этом TMS'е байт как раз 16 бит. Поэтому sizeof выдает правильный результат. А char может иметь любой размер при условии, что он больше 8 бит. Т.е. может иметь хоть 16, хоть 24, хоть 32. При том, что размер байта на этой же платформе может быть и 8 бит. В общем, это отдано на откуп реализации. Но чаще всего char делают размером с байт (по здравому смыслу), т.к. платформы с минимально адресуемой ячейкой менее 8 бит являются экзотикой (равно как и спец фичи типа битовых процессоров MCS-51).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 21 2009, 04:39
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(dxp @ Aug 21 2009, 08:13)  А char может иметь любой размер при условии, что он больше 8 бит. Т.е. может иметь хоть 16, хоть 24, хоть 32. При том, что размер байта на этой же платформе может быть и 8 бит. Тогда несостыковка получается, т.к. явно указывается, что sizeof(char)=1. То есть если у системы восьмибитный байт, то char тоже обязан быть восьмибитным. Получается, что sizeof возвращает размер в байтах, который равен размеру в char'ах. А байт и char могут иметь любой размер. Так что SM прав, посыпаю голову пеплом
|
|
|
|
|
Aug 21 2009, 04:54
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aaarrr @ Aug 21 2009, 10:39)  Тогда несостыковка получается, т.к. явно указывается, что sizeof(char)=1. То есть если у системы восьмибитный байт, то char тоже обязан быть восьмибитным. Здесь ещё один прикол есть. В Си не существует типа данных, меньшего char! Даже массив "байт" нельзя создать в системе с 16-бит char. Поэтому есть в системе "байт" или нет его - знает только программист. У меня затык возник когда BIOS процедура, работающая с USB требует передать ей размер именно в байтах (по USB-стандарту), а sizeof() объектов, которые я хочу передать, мне возвращаются в У.Е. И соответствие между USB-bytes и У.Е. мне необходимо вычислить.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 21 2009, 05:09
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(GetSmart @ Aug 21 2009, 08:54)  И соответствие между USB-bytes и У.Е. мне необходимо вычислить. На сколько я помню, в USB далеко не все дескрипторы имеют четную длину. Так что вроде как не судьба автоматом-то считать. Цитата(aaarrr @ Aug 21 2009, 08:05)  По стандарту C99 - в байтах: И по тому же стандарту - байт: Цитата 1 byte addressable unit of data storage large enough to hold any member of the basic character set of the execution environment 2 NOTE 1 It is possible to express the address of each individual byte of an object uniquely. так что все в норме, никто не говорил, что он 8 бит.
|
|
|
|
|
Aug 21 2009, 05:27
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(SM @ Aug 21 2009, 11:09)  так что все в норме, никто не говорил, что он 8 бит.  Компиляторописатели... Получается, что "программный" байт и "железный" байт не одно и то же. А если программист читает User Manual, то он реально запутается, т.к. в мануале байт - это честные 8 бит. Цитата(aaarrr @ Aug 21 2009, 11:00)  ... использовав для записи USB дескрипторов только половину, благо их немного. А вот это я вообще не понял. Чего немного?
Сообщение отредактировал GetSmart - Aug 21 2009, 05:27
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
GetSmart Как стандартно в Си узнать размер char-а Aug 20 2009, 17:24 Axel Я бы сделал так:
#ifdef TMS320
#define SIZE_OF_CH... Aug 20 2009, 19:40   aaarrr Цитата(GetSmart @ Aug 21 2009, 07:59) Мне... Aug 21 2009, 04:05    SM Цитата(dxp @ Aug 21 2009, 08:13) другими ... Aug 21 2009, 04:22     dxp Цитата(SM @ Aug 21 2009, 11:22) На этом T... Aug 21 2009, 12:33      SM Цитата(dxp @ Aug 21 2009, 16:33) А по ско... Aug 21 2009, 12:49       defunct Цитата(SM @ Aug 21 2009, 15:49) Т.е. если... Aug 21 2009, 16:46        GetSmart Цитата(defunct @ Aug 21 2009, 22:46) В об... Aug 21 2009, 16:52         defunct Цитата(GetSmart @ Aug 21 2009, 19:52) Щас... Aug 21 2009, 17:01          SM Цитата(defunct @ Aug 21 2009, 21:01) Ну о... Aug 21 2009, 17:32          GetSmart Цитата(defunct @ Aug 21 2009, 23:01) Ну о... Aug 21 2009, 18:25    Andron_ Цитата(dxp @ Aug 21 2009, 11:13) Наскольк... Sep 9 2009, 15:52 aaarrr Ну, тогда вполне подходит способ, предложенный Rea... Aug 21 2009, 05:00 aaarrr Цитата(SM @ Aug 21 2009, 09:09) так что в... Aug 21 2009, 05:43 GetSmart Цитата(aaarrr @ Aug 21 2009, 11:43) Дескр... Aug 21 2009, 06:04  aaarrr Цитата(GetSmart @ Aug 21 2009, 10:04) До ... Aug 21 2009, 07:09  ReAl Цитата(GetSmart @ Aug 21 2009, 09:04) тут... Aug 21 2009, 10:23   aaarrr Цитата(ReAl @ Aug 21 2009, 14:23) А Вы го... Aug 21 2009, 10:29   GetSmart Цитата(ReAl @ Aug 21 2009, 16:23) А Вы го... Aug 21 2009, 10:31 aaarrr Ну а в C99 написано:
Цитата3.6
1 byte
addressable ... Sep 9 2009, 15:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|