|
Как стандартно в Си узнать размер 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:05
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(GetSmart @ Aug 21 2009, 07:59)  Мне тут SM подсказывает, что sizeof() по стандарту должен выдавать размер как раз в char-ах. Вопрос: так ли это на самом деле? По стандарту C99 - в байтах: Цитата The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. и еще вот это интересно: Цитата When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
|
|
|
|
|
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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 21 2009, 06:04
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aaarrr @ Aug 21 2009, 11:43)  Дескрипторов немного, поэтому не жалко использовать половинку от char'а на каждый байт. До сих пор не понял. Код USB_postTransaction(&EP2_OUT, size, buf, USB_IOFLAG_NOSHORT); тут size передаётся в "железных" USB-байтах, а buf - указатель на буфер, из которого будет извлечено 100% бит, то есть если это char[10], то оттуда передастся 20 "железных" USB-байт.
Сообщение отредактировал GetSmart - Aug 21 2009, 06:11
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|