|
Как стандартно в Си узнать размер 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 21 2009, 10:31
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Aug 21 2009, 16:23)  А Вы говорите "октет", как в сетях принято :-) Именно потому, что байты - они всякие бывают. Цитата(http://en.wikipedia.org/wiki/Byte) The popularity of IBM's System/360 architecture starting in the 1960s and the explosion of microcomputers based on 8-bit microprocessors in the 1980s has made eight bits by far the most common size for a byte. The term octet is widely used as a more precise synonym where ambiguity is undesirable (for example, in protocol definitions). Ну да, исхитрились. Хотя в русской литературе везде байтом считается 8 бит без каких-либо оговорок. Даже в доке от TI Цитата(spru587e.pdf @ page 28) Byte = An 8-bit value. A byte is the smallest unit of data transferred in a DMA channel.
Сообщение отредактировал GetSmart - Aug 21 2009, 10:35
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 21 2009, 12:33
|

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

|
Цитата(SM @ Aug 21 2009, 11:22)  На этом TMS-е есть адресации "low_byte(addr)" и "high_byte(addr)" для команд load/store. Так что байт там как у всех. А по скорости/накладным они такие же, как и для словной адресации? Или это некое расширение, реализуемое за счет эмуляции (типа, слово считывается целиком, в АЛУ модифицируется нужный байт и потом складываются в память)? Цитата(aaarrr @ Aug 21 2009, 11:39)  Тогда несостыковка получается, т.к. явно указывается, что sizeof(char)=1. То есть если у системы восьмибитный байт, то char тоже обязан быть восьмибитным. Да, насчет sizeof(char) был неправ (давно было, забывать начал  ). В плюсах тоже так же: sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 21 2009, 12:49
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(dxp @ Aug 21 2009, 16:33)  А по скорости/накладным они такие же, как и для словной адресации? Или это некое расширение, реализуемое за счет эмуляции (типа, слово считывается целиком, в АЛУ модифицируется нужный байт и потом складываются в память)? Да, по скорости и накладным тоже самое, но только в том случае, если заранее известно, какой байт нужен - low или high. К АЛУ это отношения не имеет, так как при обращениях оно управляет сигналами "byte enable (BE[1:0])" шины, или DQM-ами, если это SDRAM. Но адрес-то при этом все равно словесный, а выбор байта осуществляется при помощи указания конкретной команды ассемблера. Т.е. если организовывать полностью произвольный доступ к любому байту - то нужно иметь словесный адрес, бит выбора байта и условное выполнение той или другой команды. Плюс ко всему, если слово памяти может быть аргументом любой арифметики и можно сказать любой операции вообще, то байт из памяти только или load, или store.
|
|
|
|
|
Aug 21 2009, 16:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Aug 21 2009, 22:46)  В общем очередное дерьмецо от TI... Годное только для обработки звука. Щас SM Вас порвёт  На самом деле, раз адресация в проце на 90% только пословная, то TI сделали правильно. Там только DMA имеет байтовый адрес. Асмописатели на TMS наверное очень довольны такой архитектурой, в отличие от сишников. SM как раз один из них.
Сообщение отредактировал GetSmart - Aug 21 2009, 16:59
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Sep 9 2009, 15:52
|
.NET developer
  
Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532

|
Цитата(dxp @ Aug 21 2009, 11:13)  Насколько помню, sizeof возвращает размер в минимально адресуемых единицах на данной платформе. И "байтом" обычно эту минимально адресуемую ячейку памяти и называют, другими словами, на этом TMS'е байт как раз 16 бит. Поэтому sizeof выдает правильный результат. в каком-то из TI'ных мануалов есть фраза что-то вроде "вообще-то байт конечно 8 бит, но если очень хочется, как у нас, то байт будет 16 бит. Именно в этих 16-ти битных байтах и выдает результат sizeof"... я еще над ней посмеялся))))
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|