Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347

Перевести биты int в unsigned int

10.10.2019, 17:33. Показов 7006. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, как можно получить из int -> unsigned int, т.е. где все биты в таком же порядке, по идее тогда будет без минуса.

Пример:
int - -2147483647
unsigned int - 0

int 0
unsigned int - 2147483647
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2019, 17:33
Ответы с готовыми решениями:

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.

Как массив char[4] перевести в unsigned int?
Есть массив из 4х char символов (4-е байта), нужно его перевести в unsigned int. Я сделал втупую: unsigned int B=0; ...

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать что 5 будет именно unsigned int? unsigned int n=5; ...

56
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
12.10.2019, 02:13
Студворк — интернет-сервис помощи студентам
Я по-прежнему не понимаю, в чом проблема. Объясните мне, дебилу, чо не так-то?

0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
12.10.2019, 06:46
k0vpack, расскажи конкретно задачу (одними словами, без использования C++), что ты пытаешься сделать? Возможно, ты неправильный путь выбрал. Я бы даже сказал - это очевидно
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 13:54
Цитата Сообщение от rat0r Посмотреть сообщение
Насколько мне известно, UB. memcpy-то между двумя объектами одного trivially copyable типа "разрешён" только ненормативной сноской, а между разными типами это вообще ХЗ что значит.
Это очень интересный вопрос. Казалось бы задача весь тривиальная или нет? Если выйти в интернет с таким вопросом, о type punning'е в С++, то вариант с memcpy самый популярный что ли и там утверждают, что это ОК. Но так ли это?
Что говорит стандарт:
Цитата Сообщение от N4659 6.9/2
For any object of trivially copyable type T, whether or not the object holds a valid value of type T, the underlying bytes making up the object can be copied into an array of char, unsigned char, or std::byte. [...]
Цитата Сообщение от N4659 6.9/3
For any trivially copyable type T, if two pointers to T point to distinct T objects obj1 and obj2, where neither obj1 nor obj2 is a base-class subobject, if the underlying bytes making up obj1 are copied into obj2, obj2 shall subsequently hold the same value as obj1.
Я конечно не знаток, но здесь вроде как говорится то, что если мы хотим скопировать два объекта (underlying bytes), то мы это можем сделать только тогда, когда они имеют the same trivially copyable type T. Тогда, тот же популярный type punning между int и float даже через memcpy - UB. И в С++20 тоже, ведь в новом стандарте эти строчки не изменились, но появился bit_cast, который вроде вот все, наше спасение и разрешает кастить даже между разными типами:
Цитата Сообщение от N4830 26.5.3/1
Returns: An object of type To. Each bit of the value representation of the result is equal to the corresponding bit in the object representation of From.

Ну, допустим там происходит какая-то магия )

Но, вернемся к С++17, что мы имеем на данный момент? Почему каст при помощи memcpy не UB? Ну, как минимум можно сказать, потому, что memcpy интерпретирует оба объекта как unsigned char*, при таком условии все получается как по маслу, теперь это не каст между разными типами и все ОК, до того времени пока мои объекты которые я хочу скастить не перекрываются, иначе опять UB. С другой стороны есть memmove, который работает, как и memcpy и еще сверху говорит, что objects may overlap и это не UB.
Хм, а значит ли это то, что можно написать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename From, typename To>
typename std::enable_if<
    (sizeof(From) == sizeof(To)) &&
    std::is_trivially_copyable<From>::value &&
    std::is_trivial<To>::value,
To>::type bit_cast(From const& src) noexcept {
    To dst;
    std::memmove(&dst, &src, sizeof(To));
    return dst;
}
 
union {
    int   i;
    float f;
} type_pun{-1};
 
int main() {
    type_pun.f = bit_cast<int, float>(type_pun.i); // now active type_pun.f?
}
?
В общем компилятор генерит одинаковый output, что с bit_cast, что просто pun'ить через неактивное поле.
https://godbolt.org/z/LBKUEO
https://godbolt.org/z/AxKkZh


Получается в С++17 мы безопасности пока наши объекты: TriviallyCopyable, одинакового размера и пока memcpy гарантирует представление объектов как unsigned char*?
Наверное, да
Еще стоило бы упомянуть о выравнивании, у нас нету гарантии, что unsigned char* будет выровнен, но это другая история
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 16:16
Цитата Сообщение от Azazel-San Посмотреть сообщение
то мы это можем сделать только тогда, когда они имеют the same trivially copyable type T.
Нет, в приведенной цитате говорится, что если мы вызовем memcpy для двух объектов одного типа, то в результате получим объекты с одинаковыми значениеми. Про объекты разных типов там ничего не сказано.

Цитата Сообщение от Azazel-San Посмотреть сообщение
Хм, а значит ли это то, что можно написать так:
Нет, так нельзя. Strict aliasing запрещает такое делать. Но при этом стандарт разрешает взять некоторый объект, представить его в виде массива байт и записать что-либо в этот массив. Это будет не UB, пока у объекта остается корректное значение.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 16:36
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Про объекты разных типов там ничего не сказано.
Ну, именно. Про объекты разных типов ничего не сказано.
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Strict aliasing запрещает такое делать.
Можно подробнее, такое это какое? Что именно?
Из-за strict aliasing мы не можем pun'ить через не активное поле union'a - это понятно, тут он запрещает.
Я же так не делаю, плюс memmove дает гарантию, что объекты могут перекрываться:
The objects may overlap: copying takes place as if the characters were copied to a temporary character array and then the characters were copied from the array to dest.
И это не будет UB.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 16:41
Цитата Сообщение от Azazel-San Посмотреть сообщение
union {
* * int * i;
* * float f;
}
В C++, в отличие от C, type punning через union является UB.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 16:43
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В C++, в отличие от C, type punning через union является UB
В Си тоже UB

Добавлено через 54 секунды
Если я правильно понял, какой смысл вкладывается в "type punning"
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 16:57
Цитата Сообщение от Evg Посмотреть сообщение
В Си тоже UB
Цитата Сообщение от Evg Посмотреть сообщение
Если я правильно понял, какой смысл вкладывается в "type punning"
Я имел ввиду что-то такое:
C
1
2
3
4
5
6
7
8
9
union A
{
  int x;
  float y;
};
 
union A a;
a.y = 1.0f;
printf("%d", a.x);
Где-то читал, что в Си это не UB.

Добавлено через 7 минут
Цитата Сообщение от Azazel-San Посмотреть сообщение
Я же так не делаю, плюс memmove дает гарантию, что объекты могут перекрываться:
Вот кстати точно не знаю. Strict aliasing зарпещает рассматривать одну и ту же область памяти как объекты разных типов (с некоторыми исключениями). В memmove скорее всего подразумевается, что перекрываться могут только области памяти, соотвествующие объектам одного и того же типа.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 17:00
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В C++, в отличие от C, type punning через union является UB.
Aaa?
Цитата Сообщение от N4659 6.10/8
If a program attempts to access the stored value of an object through a glvalue of other than one of the
following types the behavior is undefined:
[...]
an aggregate or union type that includes one of the aforementioned types among its elements or nonstatic data members (including, recursively, an element or non-static data member of a subaggregate or contained union),
[...]
Union не нарушает strict aliasing.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
type punning через union
Еще раз я же делаю это не через НЕ активное поле.

Добавлено через 2 минуты
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В memmove скорее всего подразумевается, что перекрываться могут только области памяти, соотвествующие объектам одного и того же типа.
Вот это уже интересно, но так нигде не сказано.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 17:12
Цитата Сообщение от Azazel-San Посмотреть сообщение
Еще раз я же делаю это не через НЕ активное поле
В твоём примере из поста #23 не совсем понятно, зачем использовался union. Проще было бы использовать отдельную переменную типа int и отдельную типа float, дабы не загромождать вашу обсуждаемую проблему лишними сущностями. Это в свою очередь привело к неправильному пониманию в посте #26, а может быть и излишней каше в собственной голове. Честно говоря, мне лень вникать в весь ваш диалог, но, если я правильно понял, то в посте #23 ты попросту сравнивал два разных подхода, которые более корректно было бы записать так:

C++
int I;
float F;
 
int main()
{
  // Вариант 1
  F = bit_cast<int, float>(I);
 
  // Вариант 2
  type_pun.i = I;
  F = type_pun.f;
}
Да, оба варианта дадут одинаковый результат. Но по факту второй вариант является некорректным, т.к. нарушает strict aliasing, а первый вариант в случае использования memcpy является законным, а в случае memmove - точно сказать не могу, но скорее всего тоже законен
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 17:21
Цитата Сообщение от Evg Посмотреть сообщение
ты попросту сравнивал два разных подхода
Ну, да. Я хотел узнать можно ли делать тоже самое с memmove, что делают и с memcpy? С поправкой на возможности memmove.
Просто union это пример этих самых перекрывающихся объектов.
Вообще исходя из описания memmove, я хотел сделать так:
C++
1
std::memmove(&type_pun.f, &type_pun.i, sizeof(type_pun.f));

Цитата Сообщение от Evg Посмотреть сообщение
Но по факту второй вариант является некорректным, т.к. нарушает strict aliasing
Верно, но я же так не делаю. Я не читаю из поля .f пока активен .i

Добавлено через 2 минуты
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Где-то читал, что в Си это не UB.
Кстати в Си таки это вроде не UB.
Цитата Сообщение от N2434 6.2.6/6
When a value is stored in an object of structure or union type, including in a member object, the
bytes of the object representation that correspond to any padding bytes take unspecified values.
The value of a structure or union object is never a trap representation, even though the value of a
member of the structure or union object may be a trap representation.
Да и в Си нету активных или не активных полей. Или я не увидел?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 18:15
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Где-то читал, что в Си это не UB
Цитата Сообщение от Azazel-San Посмотреть сообщение
Кстати в Си таки это вроде не UB
По ходу вы правы, а я ошибся

Приведение указателя базового типа
(правда русскоязычный перевод не совсем корректен)

Там выдержка НЕ из стандарта, но, вероятно, так оно и есть. Т.е. начиная с C99, судя по всему, узаконили запись в одно поле union'а и чтение из другого поля

Ну и вот здесь немного разжёвано: https://stackoverflow.com/ques... esentation

Добавлено через 4 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
Вообще исходя из описания memmove, я хотел сделать так:
Для Си именно так было бы естественным. Но для Си++ с концепцией шаблонов так красиво не получается, всегда вылезает промежуточное значение. При вызове memmove напрямую действительно можно было бы вести речь о пересекающихся данных, но в твоей реализации bit_cast об этом говорить не приходится, ибо работа идёт через value
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 18:31
Цитата Сообщение от Evg Посмотреть сообщение
но в твоей реализации bit_cast об этом говорить не приходится, ибо работа идёт через value
Там еще стоит учитывать copy elision. Компилятор имеет право не создавать временную переменную, а напрямую работать с возвращаемым значением.

Цитата Сообщение от Azazel-San Посмотреть сообщение
C++
1
std::memmove(&type_pun.f, &type_pun.i, sizeof(type_pun.f));
Единовременно активен либо type_pun.f либо type_pun.i. Разве запись по адресу type_pun.f не будет эквивалентна записи в еще не инициализированный (или даже еще не созданный с точки зрения стандарта) объект?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
12.10.2019, 19:01
Такое тоже UB? (сейчас конкретно для типов с одинаковыми объемами памяти)

C++
1
2
3
    int a = -1;
    void* pv = &a;
    std::cout << *(reinterpret_cast<unsigned int*>(pv));
Я такое понимаю как насильственный вывод sizeof(unsigned int) байт по pv в представлении unsigned int. //или я не так понимаю?

Это я так понял что автору нужно, хотя не уверен что правильно понял.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 19:07
Цитата Сообщение от Folian Посмотреть сообщение
Такое тоже UB?
Нет, тут все ок, с этим мы уже разобрались. Но если вместо unsigned int вставить, скажем, float (одного размера с int), то уже будет UB. Это поведение прописано в графе [basic.lval] стандарта.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
12.10.2019, 20:20
Цитата Сообщение от Azazel-San Посмотреть сообщение
Почему каст при помощи memcpy не UB? Ну, как минимум можно сказать, потому, что memcpy интерпретирует оба объекта как unsigned char*
Что значит "интерпретирует как unsigned char*"?
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Но при этом стандарт разрешает взять некоторый объект, представить его в виде массива байт и записать что-либо в этот массив.
Ого. Это где такое разрешает?
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Где-то читал, что в Си это не UB.
Стоит читать не где-то, а в стандарте C.
А там на этот счёт только одна мутная сноска.
Цитата Сообщение от Azazel-San Посмотреть сообщение
If a program attempts to access the stored value of an object through a glvalue of other than one of the
following types the behavior is undefined:
[...]
an aggregate or union type that includes one of the aforementioned types among its elements or nonstatic data members (including, recursively, an element or non-static data member of a subaggregate or contained union),
[...]
Union не нарушает strict aliasing.
В C++ не существует access через glvalue of union type. Так что этот подпункт про union выпилили.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Нет, тут все ок, с этим мы уже разобрались.
Ну и какое же поведение у кода
C++
1
2
    int a = -1;
    std::cout << *(reinterpret_cast<unsigned int*>(&a));
(указатель на void ничего не меняет, так что я подсократил код)???
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 21:03
Цитата Сообщение от rat0r Посмотреть сообщение
Ого. Это где такое разрешает?
Потому что к объекту разрешено получать доступ через char, unsigned char и std::byte, как сказано в [basic.lval].

Цитата Сообщение от rat0r Посмотреть сообщение
Ну и какое же поведение у кода
Определенное.

rat0r, у тебя есть какие-то другие сведения на этот счет?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 22:05
Цитата Сообщение от Evg Посмотреть сообщение
Там выдержка НЕ из стандарта, но, вероятно, так оно и есть.
Да потому что, со стороны архитектуры и компьютера такое преобразование вполне понятное.
Если посмотреть на ядро Линукса, там везде такое и это ОК (речь о Си).
Цитата Сообщение от Evg Посмотреть сообщение
Для Си именно так было бы естественным.
И для меня странно почему это не так для С++.
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Компилятор имеет право не создавать временную переменную, а напрямую работать с возвращаемым значением.
Она там по любому создается. Причем там copy elision?
Цитата Сообщение от rat0r Посмотреть сообщение
Что значит "интерпретирует как unsigned char*"?
Это:
Copies count characters from the object pointed to by src to the object pointed to by dest. Both objects are reinterpreted as arrays of unsigned char.
Цитата Сообщение от rat0r Посмотреть сообщение
Так что этот подпункт про union выпилили.
И что это значит?
Цитата Сообщение от rat0r Посмотреть сообщение
Ну и какое же поведение у кода
Не понятное?..

Добавлено через 1 минуту
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Потому что к объекту разрешено получать доступ через char, unsigned char и std::byte
После каста к ним?
Где это? Можно цитату?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.10.2019, 22:14
Цитата Сообщение от Azazel-San Посмотреть сообщение
Да потому что, со стороны архитектуры и компьютера такое преобразование вполне понятное
Это-то да. Но strict aliasing rules - это то, что нужно компилятору для эффективной работы. По факту type punning через union работает на любом более-менее адекватном компиляторе. Просто потому, что по факту это используется много где, несмотря на то, что с точки зрения стандарта является не законным, а потому в компиляторах это поддержано. Благо такие случаи не вызывают никаких проблем ни с реализацией, ни с производительностью. Это один из тех редких случаев, когда здравый оказался выше стандарта
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
12.10.2019, 22:19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Потому что к объекту разрешено получать доступ через char, unsigned char и std::byte, как сказано в [basic.lval].
[basic.lval] только запрещает доступ кроме как через определённые типы, но не говорит что будет при доступе через разрешённые. Отсутствие запрета ≠ определение поведения.
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Определенное.
Ну вот расскажи подробно (по шагам) и с ссылками на стандарт как вычисляется выражение *reinterpret_cast<unsigned int*>(&a); что получится в результате.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Both objects are reinterpreted as arrays of unsigned char.
Ну с точки зрения стандарта плюсов это не очень понятно что значит.
Цитата Сообщение от Azazel-San Посмотреть сообщение
И что это значит?
Да ничего не значит, он никогда не использовался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2019, 22:19

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"?
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать аргумент 1 из &quot;unsigned int&quot; в &quot;unsigned int...

Надо перевести переменную типа unsigned char* в signed int и обратно
у меня есть переменная типа unsigned char*, мне нужно перевести ее в signed int , провести арифметические вычисления и затем перевести ее...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

[C++ Error] Unit2.cpp(22): E2034 Cannot convert 'int (*)(int,int *)' to 'int'
Всем привет! Пожалуйста , помогите , почему выдает ошибку Unit2.cpp(22): E2034 Cannot convert 'int (*)(int,int *)' to 'int' ?. Мне нужно...

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый символ - цифра числа в 16-значной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru