|
Как стандартно в Си узнать размер 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, 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.
|
|
|
|
Сообщений в этой теме
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       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    aaarrr Цитата(dxp @ Aug 21 2009, 08:13) А char м... Aug 21 2009, 04:39     GetSmart Цитата(aaarrr @ Aug 21 2009, 10:39) Тогда... Aug 21 2009, 04:54      SM Цитата(GetSmart @ Aug 21 2009, 08:54) И с... Aug 21 2009, 05:09       GetSmart Цитата(SM @ Aug 21 2009, 11:09) так что в... Aug 21 2009, 05:27    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
|
|
|