Я начал пытаться реализовывать новые типы данных, в частности значения с плавающей запятой, используя C. Я придумал такой способ реализации binary128
с использованием long_int , который я не совсем понял.
То, как я начал, заключалось в том, чтобы реализовать его, скопировав код и изменив его. Однако код написан на C++, а C не поддерживает ООП, поэтому мне нужно попытаться перевести код.
Я не могу найти версию C для
longer_int
, потому что этот вопрос у меня когда-то был (тот же аккаунт, но теперь удален) теперь удален, и я не могу просмотреть ссылки.
Как с помощью этих файлов C++ реализовать binary128
с помощью C?
И чтобы этот вопрос не был закрыт, я хочу знать, как перевести формат ООП в
longer_int.h
.class longer_int { private: char num_str[]; public: longer_int(); longer_int(const int &num); longer_int(const char &num[]); longer_int(const longer_int &num); // Sample code from it, now translated to C, but still OOP
Добро пожаловать на stackoverflow.com. Пожалуйста, найдите время, чтобы прочитать страницы справки , особенно разделы под названием "На какие темы я могу задать здесь вопросы?" и «Каких вопросов мне следует избегать?» . Также, пожалуйста, посетите тур и прочитайте о Как задавать хорошие вопросы. Наконец, пожалуйста, прочитайте этот контрольный список вопросов. Это много для чтения, но это поможет вам лучше писать вопросы.
Приведенная вами ссылка не работает...
@Cowboy_Patrick Какой?
Если вы не возражаете против расширений компилятора, см. gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Floating-Types.html
longer_int
не является типом с плавающей запятой.
Этот: stackoverflow.com/questions/65168668/…
@Cowboy_Patrick Это могут видеть только модераторы и пользователи с > 10 тысячами представителей.
@Шон Да, это то, что я ищу. Странная вещь заключается в том, что я хотел изменить его, чтобы фактически превратить его в число с плавающей запятой, но я понятия не имею, как это сделать. Попытка double
могла бы мне помочь, но я не знала, с чего начать. Спасибо за ссылку. Мне нужно это.
Лучшим вариантом использования C будет реализация binary128 в качестве типа структуры.
struct binary128 {
unsigned char data[16];
};
Имейте в виду, что в C нет перегрузки операторов, поэтому вам нужно будет реализовать все взаимодействие с типом (например, присваивание из другого типа, арифметические операции и т. д.) как функции.
Перейдите по ссылке в комментариях, опубликованных Шоном, чтобы увидеть более общий случай: реализация целых чисел произвольной ширины.
Что ж, я хотел тип с плавающей запятой, поэтому я думаю, что хорошая форма сделать это — найти больше вещей, которые помогут мне построить фактический тип данных.
Вы должны начать примерно так: struct
вместо class
, игнорировать ключевые слова public
/private
, конструкторы — это методы, которые возвращают my_int128
. В C нет перегрузки, поэтому каждый отдельный конструктор должен иметь другое имя. Другая школа мысли сказала бы, что вам не нужны специализированные конструкторы, а просто специальные установщики методов, которые могут копировать данные из int
, из char[]
и из my_int128
(и я предпочитаю эту школу мысли). Я привожу пример сеттера в конце.
#include <stdio.h>
#include <string.h>
typedef struct
{
char num_str[16]; /* fixed to int128 */
} my_int128;
/* Don't need this: my_int128 li = { 0 }; is enough!
my_int128 create_int128()
{
my_int128 li = { 0 };
return li;
}
*/
my_int128 create_int128_from_num(int num)
{
my_int128 li = { 0 };
/* TODO: set li with num */
return li;
}
my_int128 create_int128_from_char_array(const char num[16])
{
my_int128 li = { 0 };
memcpy(li.num_str, num, 16);
return li;
}
my_int128 create_int128_from_int128_ptr(const my_int128 *num)
{
return create_int128_from_char_array(num->num_str);
}
Сеттер:
void set_from_int(my_int128 *li, int num)
{
/* TODO: set li with num */
}
До сих пор не могу понять, как справиться с TO-DO. Попытка все еще с тяжелыми днями работы.
@MarkGiraffe Это зависит от того, как вы хотите «организовать» свой binary128
. Я написал "ТОТО" именно по этой причине. Есть разные способы сделать это
Я предполагаю, что у вас есть некоторый объектный код C++, и вы хотите переписать его на простом C. Если вы думаете, что первые компиляторы C++ были просто препроцессорами, которые генерировали код C, это не должно быть слишком сложно.
Сначала предостережения:
При этом, чтобы перевести класс C++, вы создаете структуру C для хранения элементов данных и заменяете методы простыми функциями. В этой последней части вы просто заменяете скрытый this
явным указателем в качестве дополнительного параметра.
Насколько я знаю, структуры ближе всего к классам, но я все еще не понимаю, как полноценная ООП работает через универсальную.
Этот сайт не является "пожалуйста, напишите для меня код" (особенно не полная библиотека). Если есть часть кода, которую вы не понимаете, вы можете спросить. Но должен быть конкретный вопрос.