Я считаю, что этот вопрос задавался много раз, но я не думаю, что есть конкретный ответ. Если есть, я не могу его найти, пожалуйста, направить меня, если это возможно.C пользовательские типы данных
В любом случае, поддерживает ли C любой способ абстрагирования байтов/слов/слов в определенное представление?
Плавающие точки с плавающей запятой и двойной точностью, по-видимому, являются основными функциями, но на самом деле они не являются новыми типами данных, но представляют собой повторное представление существующего слова/слова.
так, интересно, возможно ли сделать что-то вроде этого: let mydatatype be unsignedbyte, который автоматически сбрасывает себя при компиляции.
например.
mydatatype a = 0xff;
будет представлен в двоичной форме как 0x00;
Я спрашиваю, потому что C++ пытается исправить это с перегрузкой =, и классы, но это немного больше абстракции, чем я хотел бы, потому что, скажем, я имею право сделать это:
memcpy(&my_int, &my_float, 4);
то я бы позволил побитовые манипуляциям играть с междунар и положить его обратно
memcpy(&my_float, &my_int, 4);
тогда, я не уверен, что если, скажем, поплавок был определен как класс, я мог бы сделать это низко уровень , вместо этого он полностью абстрагирует все способы борьбы с ним, кроме методов класса.
Мне любопытно, потому что, если это не функция языка C, то почему нет, это, кажется, идеально сочетается с обоснования включения поплавков и двойников, но мы не можем создавать комплексные числа, несмотря на то, что они бы примерно так же легко добавить к c-языку, как float и double.
Это беспокоило меня в течение некоторого времени, главным образом потому, что, как только я хочу создать тип данных, я начинаю мигрировать в область void-указателей, структур и типов hetrogenous, что кажется , чтобы быть un -необходимо.
например: void * my_data_type = my_data_type_new (0xff); , который «отрицает» 0xff на 0 и сохраняет его в памяти, на которую указывает my_data_type.
это кажется не нужно, потому что все, что я хочу, это negchar my_data_type = 0xff;
который компилятор смог распознать.
, а затем я мог
memcpy(&my_char, &negchar, 1);
и my_char будет 0.
выше не выполняется в классах C++ ...
поплавки, двойники абстрактны в том смысле, что они ведут себя по-своему, сохраняя ABI, но они не сильно отличаются друг от друга, как говорят, сложные числа, поскольку сложное число также может быть представлено с использованием конкретного ABI.
Я имею в виду, я не думаю, что я могу даже объявить давным-давно (я могу?), Не прибегая к созданию ... определений типов
Чтобы сделать это на самом деле вопрос, я сузит ответы to: Эта функция доступна в C? если да, то как я могу это сделать? Если нет, есть ли такая возможность когда-либо рассматривалась, если это не так, потому что поплавки, двойники являются особыми из-за исторической потребности в реальном представлении чисел, что делает эту абстрактную функцию основной особенностью?
Я понимаю, что языки, такие как Fortran, поддерживали реальные номера по умолчанию, но я думаю, что C сможет извлечь эту функцию из «основной функции» и позволить программисту создавать абстрактные ABI типы, без необходимости прибегать к указателям на блоки памяти, которые необходимо освободить, и обеспечить более сильную проверку типа на нем.
В частности, очень странно, как, насколько мне известно, только абстрактные структуры статических данных с полной абстракцией, являются плавающими и двойными. В то время как все другие практики играют с динамической памятью или допускают злоупотребление заметками (используя символ, но только изменяя его с помощью функций).
Вывод: C++ 11, похоже, поддерживает это, добавление новых типов данных в C будет очень запутанным, поплавки и удвоения необходимы из-за естественного спроса на реальные представления в программировании, и хотя функция может быть реализована посредством абстрактные типы данных, в то время имело смысл сделать их частью ядра языка.
Спасибо! ~ Dmitry
отступов линию с 4-пространства заставляет его быть отформатирована в виде кода. Используйте ссылку [edit], чтобы улучшить читаемость вашего вопроса. –