- 1
def neg(x): return int(bin(x)[2:].rjust(8, '0').replace('1','x').replace('0','1').replace('x','0'), 2)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
def neg(x): return int(bin(x)[2:].rjust(8, '0').replace('1','x').replace('0','1').replace('x','0'), 2)
Операция "NEG"
Ну и хуйня! Для правильного перевода надь использовать библиотеку с длинной арифметикой, а не это вот. Кто сказал, что x должен содержать не более чем 8 бит?
Хотя тут будет UB в одном особом числе, так что можно исправить в
числе Тараса
Для дополнительного кода (two’s complement):
А в прямом коде (который используется в плавпитухе) и инвертировать ничего не надо, только знак сменить.
NEG совпадает с NOT только для обратного кода (one’s complement), который применялся в говне мамонта вроде UNIVAC.
Всеотцу говно не унять.
Какой багор )))
Не сработает, только если программа как-то хитро грузит dll (но это не про сишный рантайм) или использует трюки, завязанные на конкретную версию (но если у приложения есть манифест, то должна подгрузиться нужная версия из WinSxS).
ABI поменяли в 2017-м году, и с тех пор 140. До этого было 130.
Я бы почитал что-то внятное про это в MSDN, потому что малость плаваю, но к сожалению искать "vcruntime140.dll" в гугле это примерно как искать "почему тормозит компьютер".
`msvcr120.dll` это версия от 2013
начиная с 2015 версия vcruntime140
https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
The latest version is 14.42.34433.0 (14!!)
предыдущая 12.0.40664.0 (12)
bnl
Во-вторых, цифры — это внутренний номер студии. Ты же в курсе, что есть «товарный» номер (2005, 2010 — вот это всё), есть внутренний и есть версия конпелятора.
Такая же питушня с версиями у Борланда и у Андроида.
Нумерация продолжает шестую студию:
7.0 = 2002
7.1 = 2003
8.0 = 2005
9.0 = 2008
10.0 = 2010
11.0 = 2012
12.0 = 2013
13.0 — пропустили
14.0 = 2015
15.0 = 2017
16.0 = 2019
17.0 = 2022
Но после 14-й версии началась путаница: компоненты могут заявлять о себе не как версии 15, 16, 17, а как 14-с-копейками. Т. е. 14.00 (строго нули) — это VS 2015, а если не ноль (14.42, как в твоём реальном примере), то это более новые версии студий.
цифры есть в википедии
MS-CRT с майркрософт-специфичными плошками лежат в файлах типа `vcruntime140` (тут 140 это runtime library version 14)
До верси 2010 они лежали в WinSXS
>Microsoft Visual C++ 2005 and 2008 employ SxS with all C runtime libraries.
Начиная с Sutdio10 они стали кодировать версию в имени
https://govnokod.xyz/_29074/#comment-1312792
и их стало можно брать из system32 (куда их ставит редистрибл) или из папки самого приложения.
Начиная с версии 2015 (CRT 14) они все обратно совместимы
-------
Начиная с 2015 так же часть CRT перекочевала в UCRT (UCRTBASE.DLL).
Это аналог libc, и часть системы. оан не MS-специфична, и против нее может линковаться не только VC.
Редистрибутил ее тоже может поставить (если ее нет) но вообще с Win10 она сама приезжает и обновляется а апдейтом
VC линкуются И с vcruntime140 И с UCRTBASE.DLL (с последним -- через систему API Sets).
Брать vcruntime140 можно по-прежнему из папки или из system32, а вот UCRTBASE ВСЕГДА берется из системы на 10ке (на 8 нет, бо она про него ничего не знает)
вот тут питух с этим ебеца
https://stackoverflow.com/questions/12322185/visual-c-runtime-2005-version-download
Напомню нетленку:
http://books.mcwees.spb.ru/?compaq.html
До шестой версии вообще было одно имя MSVCRT.DLL на все версии, а они были несовместимы, и всё ломалось к хуям после запуска очередного дебильного инсталлятора. Пользователи, не знающие о таких тонких материях переустанавливали систему полностью, потом снова накатывали все программы, и... снова всё ломалось.
потом завезли WinSXS.
потом отказались (решили видимо поддерживать совместимость)
потом разделили на MS и UCRT
Вот нафига так делали?
чтобы экономить место. почитай про dll hell.
Считалось, что программист может в обратную совместимость. но разумеется он не может
а расширение `.py` знаешь?P)
Так что тут оин не одиноки.
Скорее всего это получалось случайно. Я поправил .dll, и выпустил новую версию. Я не имел ввиду ломать совместимость, но случайно её сломал.
Жопа в том, что системные файлы пользователь ставит не из единого репозитория, а с диска с играми. Игра1 принесла одну версию, Игра2 -- другую. игра1 завязалась на баг, который пофиксили в новой версии либы, и который ломает Игра2
и что делать?
>Они думали, что у меня на компе весь софт будет скомпилированный одной версией студии?
Именно потому я за BSD: там ровно так
Борхес рыдает.
https://en.m.wikipedia.org/wiki/Microsoft_Windows_library_files#MSVCRT.D LL,_MSVCP*.DLL_and_CRTDLL.DLL
Где-то на сайте MS я ещё видел, чем отличается msvcr от mscvp, но сейчас сходу не найду.
msvcrXXXX.dll is the DLL for the C runtime library. msvcpXXXX.dll is the DLL for the C++ runtime library.
только msvcr перемиеновался в vcruntime140 с версии 14, а p так и остался msvcp140
MS CRT для эскопртирует какие-то MS специфичные писки
MS-VC P эксапортирует плюсы
(они не универсальны и MS специфичны,. Чтобы писать на плюсах НЕ НА VC, тебе нужна ДРУГАЯ библиотека)
а ucrtbase экспортирует нормальную сишку
пиши против нее хоть на поскале
4.0 вышла в 1995-м, UCRT завезли в 2015-м. Джвадцать лет понадобилось обезьянам, чтобы прийти к правильному решению.
К слову, это для 64-битных процессоров пришли к одному call convention (вру, не к одному, есть как минимум sysv и ms), а у 32-битных и 16-битных был зоопарк.
Например, на 32-битных процессорах msvcrt была с конвенцией cdecl (чтобы её можно было подсунуть вместо статической библиотеки, почти ничего не меняя в коде), а остальные dll — с конвенцией stdcall.
потому надо было специально помечать функции
https://govnokod.xyz/_24405/#comment-375978
Со второго раза получилось. Сначала я перепутал конвенцию и нагадил в стек.
и другие практики звездолётов