- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
// https://git.zx2c4.com/BruteZip/tree/read.c?id=e4e9c17b99e0d108136b8a07632b1ebaa7d09d28#n26
int main(int argc, char *argv[])
{
union {
long int l;
char c[sizeof(long int)];
} u;
u.l = 1;
if (u.c[sizeof(long int) - 1] == 1) {
printf("This program only runs on little endian archs, because I'm lazy. Sorry.\n");
return -2;
}
j123123 13.02.2019 13:07 # 0
O4epegHou_nemyx 13.02.2019 13:38 # +1
gost 13.02.2019 14:25 # −1
O4epegHou_nemyx 13.02.2019 14:27 # 0
gost 13.02.2019 14:30 # 0
O4epegHou_nemyx 13.02.2019 14:36 # 0
guest8 13.02.2019 14:39 # −999
O4epegHou_nemyx 13.02.2019 14:49 # 0
O4epegHou_nemyx 13.02.2019 15:07 # +1
guest8 13.02.2019 14:38 # −999
O4epegHou_nemyx 13.02.2019 14:53 # 0
guest8 13.02.2019 15:42 # −999
Kakou-mo_nemyx 13.02.2019 17:38 # 0
Перемешивание байтов из-за «big engian», «little endian», «middle endian» меня не интересует, это и так понятно.
Коверкание чисел из-за копирования целого питуха в плавающего и обратно меня тоже не интересует. Видел я алгоритм с «обратным квадратным корнем» (0x5F3759DF), меня этим не запугать.
Что ещё бывает?
guest8 13.02.2019 17:45 # −999
Kakou-mo_nemyx 13.02.2019 17:48 # 0
guest8 13.02.2019 17:53 # −999
Kakou-mo_nemyx 13.02.2019 17:56 # 0
guest8 13.02.2019 17:58 # −999
guest8 13.02.2019 18:06 # −999
Kakou-mo_nemyx 13.02.2019 18:10 # 0
guest8 13.02.2019 18:13 # −999
O4epegHou_nemyx 13.02.2019 18:29 # +2
нахуй такой юнон, я всегда считал, что это чтоб память экономить для данных, которые не юзаются одновременно, и чтоб юзать как reinterpret_cast в крестах.
Kakou-mo_nemyx 13.02.2019 18:37 # 0
guest8 13.02.2019 18:39 # −999
Kakou-mo_nemyx 13.02.2019 18:46 # −1
Сравни:
И вот этот ужас:
O4epegHou_nemyx 13.02.2019 18:48 # +2
O4epegHou_nemyx 13.02.2019 19:03 # 0
guest8 13.02.2019 19:04 # −999
O4epegHou_nemyx 13.02.2019 19:09 # 0
guest8 13.02.2019 18:48 # −999
Kakou-mo_nemyx 13.02.2019 19:50 # +1
Вот тут, например, и не «посмотреть по-другому» (reinterpret_cast), и не «расширение/сужение», тут полноценное преобразование (с кучей арифметических действий).
Я считаю, что (int) не нужен. Лучше явно использовать floor/ceil/round/что-то там ещё, чтобы показать, как именно ты хочешь округлить.
Kakou-mo_nemyx 13.02.2019 18:33 # 0
Теоретически компилятор или рантайм могли проверить текущее значение дискриминанта (what в нашем примере), чтобы разрешить доступ только к одному варианту.
Компания «Борланд» при реализации своего диалекта решила на дискриминант положить болт. В «Турбо Паскале» и в его наследниках можно в любой момент использовать любой вариант (как в «сишке» можно использовать любой член союза):
И в «Турбо Паскале» уже можно записать значение в petookh.age, а прочитать из petookh.iq, хотя «Standard Pascal» этого не позволял.
Kakou-mo_nemyx 13.02.2019 18:17 # 0
Стандарт я этим не нарушу?
guest8 13.02.2019 18:29 # −999
Kakou-mo_nemyx 13.02.2019 18:35 # 0
00101010
01010100
10101000
01010001
10100010
01000101
10001010
00010101
Он не потребует лишней памяти.
guest8 13.02.2019 18:38 # −999
Xom94ok 14.02.2019 21:28 # 0
Всегда 42.
http://eel.is/c++draft/class.union (в других стандартах примерно то же самое)
> If a standard-layout union contains several standard-layout structs that share a
> common initial sequence ([class.mem]), and if a non-static data member of an
> object of this standard-layout union type is active and is one of the standard-layout
> structs, it is permitted to inspect the common initial sequence of any of the
> standard-layout struct members
У тебя в юнионе оба члена одинакового типа и они полностью занимают common
initial sequence. Это то же самое, что сделать мемсру из одного в другого.
guest8 14.02.2019 21:41 # −999
Xom94ok 14.02.2019 21:51 # 0
> поясни тогда цытаткуо
UPD: бля, чёт я не посмотрел на то, что тут всё про си, но чует мой пушистый зад, что в си всё намного проще, ибо нет классов и связанного нетривиального говна
guest8 14.02.2019 22:08 # −999
guest8 14.02.2019 22:30 # −999
guest8 14.02.2019 22:39 # −999
guest8 15.02.2019 01:15 # −999
Kakou-mo_nemyx 13.02.2019 15:43 # 0
Выравнивание полей структуры он разрешает, поэтому при описании структур приходится вставлять директивы компилятора (#pragma, __attribute__), чтобы не выравнивал. У некоторых ЯП даже было слово «packed» для этого.
guest8 13.02.2019 17:06 # −999
bormand 13.02.2019 19:31 # +1
Нет. Возьми юнион из uint64_t и uint8_t[9]. Его размер будет 16 а не 9.
guest8 13.02.2019 19:34 # −999
Kakou-mo_nemyx 13.02.2019 19:35 # 0
guest8 13.02.2019 19:36 # −999
Kakou-mo_nemyx 13.02.2019 19:37 # 0
bormand 13.02.2019 19:44 # 0
Да. Поэтому по-дефолту размеры всех типов достаточно выровнены.
Kakou-mo_nemyx 13.02.2019 15:46 # 0
Lorip1971 13.02.2019 14:00 # 0
i8,i16,i32,i64,i128
u8,u16,u32,u64,u128
isize,
usize
и никакой питушни с этими вашими sizeof
O4epegHou_nemyx 13.02.2019 14:10 # +2
Kakou-mo_nemyx 13.02.2019 16:07 # 0
KGeist 25.02.2019 23:35 # 0
Kakou-mo_nemyx 13.02.2019 16:15 # 0
O4epegHou_nemyx 13.02.2019 17:31 # 0
guest8 13.02.2019 16:19 # −999
Kakou-mo_nemyx 13.02.2019 16:28 # +2
На DSP, где один октет адресовать нельзя в принципе. У них в «байте» может быть 16, 32 или даже 64 бита, чего вполне хватает для того, чтобы вместить целый long int.
Были ещё древние процессоры с 24-битными, 32-битными, 36-битными, 48-битными словами, не разбитыми на байты. У «PDP-10» известный компилятор «Си» разбивал 36-битное слово на 9-битные «байты» (нонеты), но другие компиляторы могли и не разбивать.
guest8 13.02.2019 16:45 # −999
O4epegHou_nemyx 13.02.2019 17:05 # +1
guest8 13.02.2019 17:08 # −999
O4epegHou_nemyx 13.02.2019 17:14 # +1
guest8 13.02.2019 17:16 # −999
O4epegHou_nemyx 13.02.2019 17:24 # +2
guest8 13.02.2019 18:52 # −999
guest8 13.02.2019 18:35 # −999
Kakou-mo_nemyx 13.02.2019 18:40 # 0
char бывает разным. Он не обязан быть восьмибитным. Точно так же long int не обязан вмещать несколько чаров.
Тебе другой гость написал нестрогое неравенство, из которого следует, что long int может совпасть с чаром.
Были какие-то реализации, авторы которых поняли слово «char» буквально и решили уместить в него юникодный символ.
guest8 13.02.2019 18:44 # −999
guest8 13.02.2019 18:46 # −999
Kakou-mo_nemyx 13.02.2019 18:57 # 0
guest8 13.02.2019 19:00 # −999
Kakou-mo_nemyx 13.02.2019 19:06 # 0
Ещё у IEEE754 есть инструкции для двоично-десятичных данных.
А у IBM/370 был шестнадцатеричный плавающий питух:
https://en.wikipedia.org/wiki/IBM_hexadecimal_floating_point
Там порядок означал не на сколько битов нужно сдвинуть мантиссу, а на сколько шестнадцатеричных цифр.
guest8 13.02.2019 19:11 # −999
O4epegHou_nemyx 13.02.2019 19:15 # 0
guest8 13.02.2019 19:21 # −999
O4epegHou_nemyx 13.02.2019 19:23 # 0
guest8 13.02.2019 19:26 # −999
Kakou-mo_nemyx 13.02.2019 19:22 # 0
Умею я считать до двух!
—– Подумаешь! –— ворчит хорёк. —–
А я могу до четырёх!
–— Я —– до шести! –— воскликнул жук.
—– Я –— до восьми! —– шепнул паук.
Тут подползла сороконожка:
–— Я, кажется, умней немножко
Жука и даже паука —–
Считаю я до сорока!
—– Ах, ужас! –— ужаснулся уж. —–
Ведь я ж не глуп. Но почему ж
Нет у меня ни рук, ни ног,
А то и я считать бы мог!
А у меня есть карандаш.
Ему что хочешь, то задашь.
Одной ногой умножит, сложит.
Всё в мире сосчитать он может!
guest8 13.02.2019 19:44 # −999
guest8 13.02.2019 19:47 # −999
guest8 13.02.2019 19:49 # −999
guest8 13.02.2019 19:49 # −999
guest8 13.02.2019 19:50 # −999
Kakou-mo_nemyx 13.02.2019 19:58 # 0
guest8 15.02.2019 01:14 # −999
Kakou-mo_nemyx 13.02.2019 19:52 # 0
guest8 13.02.2019 19:53 # −999
guest8 13.02.2019 19:54 # −999
guest8 13.02.2019 20:02 # −999
Kakou-mo_nemyx 13.02.2019 20:10 # 0
Kakou-mo_nemyx 13.02.2019 20:16 # 0
bormand 13.02.2019 20:18 # +1
Допустим, я заюзал юникодные смайлики в строковых литералах. В чар они не входят. ЧЯНТД?
gost 13.02.2019 20:39 # +2
§ 4.4, 1
§ 5.3, 1
bormand 13.02.2019 20:40 # +1
gost 13.02.2019 20:41 # 0
bormand 13.02.2019 20:36 # +2
5.2.1.2 Multibyte characters
The basic character set shall be present and each character shall be encoded as a single byte.
Т.е. таки минимум 7 бит независимо от кодировок.
Kakou-mo_nemyx 13.02.2019 20:47 # 0
gost 13.02.2019 20:45 # 0
gost 13.02.2019 20:49 # +2
§ 6.9.1, 7
§ 6.9.1, 7, сноска 52.
bormand 13.02.2019 20:52 # +3
Ну и bit - unit of data storage in the execution environment large enough to hold an object that may have one of two values.
guest8 13.02.2019 23:19 # −999
guest8 13.02.2019 16:43 # −999
O4epegHou_nemyx 13.02.2019 17:16 # 0
guest8 13.02.2019 17:19 # −999
Kakou-mo_nemyx 13.02.2019 18:52 # +1
По такой логике на 64-битной машине надо было вообще делать sizeof(int) == 8.
guest8 13.02.2019 18:58 # −999
guest8 13.02.2019 19:03 # −999
Kakou-mo_nemyx 13.02.2019 19:14 # +1
Но ведь при сохранении данных в файл или при отправке по сети использовался явный размер. Допустим, у меня есть формат графического файла с плотностью 24 бита на пиксель (каналы R, G, B по 8 бит). Если я вместо 24 битов запишу 16, 32 или 64, аргументируя это тем, что такой размер инта на моей машине, то этот файл никто не сможет прочитать (точнее, смогут только те, кто компилировал вьюер тем же компилятором). Значит, мне придётся использовать низкоуровневую питушню, в которой я могу размер указать явно.
Почему они так сделали?
guest8 13.02.2019 19:19 # −999
Kakou-mo_nemyx 13.02.2019 19:32 # +1
Так вот, «II» означает «Иинтел», т. е. числа, не помещающиеся в байт, записывали адепты маленького конца.
«MM» означает «Ммоторола», т. е. числа, не помещающиеся в байт, записывали адепты большого конца.
Естественно, как на машине с «little endian», так и на машине с «big endian» можно было посмотреть порнокартинки обоих форматов, просто при просмотре файлов с сигнатурой «MM» на машине с интеловским процессором теоретически чуть-чуть снижался пирфоманс из-за необходимости менять порядок байтов. Хотя какой к чёрту пирфоманс из-за порядка байтов, когда основное время съедает ввод-вывод или разжатие?
guest8 13.02.2019 19:35 # −999
bormand 13.02.2019 19:36 # +1
Kakou-mo_nemyx 13.02.2019 19:40 # 0
guest8 13.02.2019 19:47 # −999
guest8 13.02.2019 19:50 # −999
bormand 13.02.2019 20:01 # +3
Т.е. тебе вообще похуй на результат твоей проги?
Есть 3 стула:
1) Для корректной работы проги тип должен вместить нужные мне числа. И мне похуй, как конпелятор его реализует.
2) Для корректной работы проги тип должен иметь указанные мной размер и представление.
3) Мне нужен самый эффективный тип на данной платформе (для длинной арифметики, к примеру).
int описывает только третий вариант. А этот вариант в реальном коде встречается гораздо реже первого...
З.Ы. Разрабатывая код, я вообще не знаю что я могу засунуть в int т.к. минимальный размер инта описан в informative приложении к стандарту, которое никого ни к чему не обязывает.
guest8 13.02.2019 20:04 # −999
bormand 13.02.2019 20:07 # 0
Ну я же пишу - во время разработки кода, а не во время копуляции.
guest8 13.02.2019 20:09 # −999
bormand 13.02.2019 20:13 # +5
Т.е. язык оказался настолько непригоден для разработки, что почти сразу (лет через 8) пришлось к нему нагородить внешний конфигуратор из говна и палок. Ок.
Kakou-mo_nemyx 13.02.2019 21:25 # 0
guest8 13.02.2019 23:29 # −999
guest8 14.02.2019 00:06 # −999
guest8 14.02.2019 13:56 # −999
guest8 14.02.2019 13:58 # −999
bormand 14.02.2019 00:08 # 0
Kakou-mo_nemyx 14.02.2019 00:49 # 0
bormand 14.02.2019 07:52 # 0
Kakou-mo_nemyx 14.02.2019 12:29 # 0
Kakou-mo_nemyx 13.02.2019 20:05 # 0
Это одно из следствий похуизма.
guest8 13.02.2019 20:10 # −999
O4epegHou_nemyx 14.02.2019 05:50 # 0
bormand 13.02.2019 20:10 # +1
Не, с файлами другая история. Никто не верил, что появятся настолько огромные накопители и тем более файлы. Причём много раз подряд не верили. Да и сейчас не верят - диски перевели на унылое LBA48 вместо LBA64.
guest8 13.02.2019 23:03 # −999
O4epegHou_nemyx 14.02.2019 05:50 # 0
guest8 15.02.2019 01:13 # −999
bormand 15.02.2019 07:24 # 0
guest8 15.02.2019 10:42 # −999
bormand 15.02.2019 12:03 # 0
Эдак и многозадачность можно запилить.
guest8 13.02.2019 20:17 # −999
bormand 13.02.2019 20:18 # 0
Иди второй вариант дочитай, блджад.
guest8 13.02.2019 20:20 # −999
j123123 14.02.2019 07:56 # 0
> int описывает только третий вариант.
Нет, не описывает. На x86-64 у тебя будет 32-битный int, но для эффективной длинной арифметике на данной платформе лучше взять 64-битный тип
j123123 14.02.2019 08:10 # 0
Нет, это не в informative. Ну может в каких-то старых и так, но давай взглянем на C17 :
> 6.2.5 Types
> A "plain" int object has the natural size suggested by the architecture of the executionenvironment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>).
> 5.2.4.2.1 Sizes of integer types <limits.h>
> Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greaterin magnitude (absolute value) to those shown, with the same sign.
bormand 14.02.2019 08:11 # 0
Т.е. int это int16_least_t. Ок.
j123123 14.02.2019 08:11 # 0
bormand 14.02.2019 08:31 # +1
Например на арме, если я не туплю, uint8 будет с флагом emulated operation но без emulated storage. А на какой-нибудь DSP'шке он получит и emulated storage.
bormand 14.02.2019 08:38 # +1
guest8 13.02.2019 19:45 # −999
bormand 13.02.2019 19:46 # +2
guest8 13.02.2019 19:48 # −999
eszett 13.02.2019 21:18 # 0
guest8 13.02.2019 23:28 # −999
guest8 14.02.2019 22:48 # −999
guest8 14.02.2019 23:53 # −999
guest8 15.02.2019 00:28 # −999
guest8 13.02.2019 16:57 # −999
O4epegHou_nemyx 13.02.2019 17:15 # 0
guest8 13.02.2019 17:16 # −999
O4epegHou_nemyx 13.02.2019 17:28 # 0
Kakou-mo_nemyx 13.02.2019 17:33 # 0
https://devblog.gosso.se/2018/06/how-to-implement-security-txt-under-well-known-in-iis/
https://cybersins.com/howto-resposible-disclosure-with-security-txt/
https://www.bountysource.com/issues/55643936-add-security-txt
https://securitytxt.org/
Kakou-mo_nemyx 13.02.2019 17:31 # 0
guest8 13.02.2019 18:36 # −999
O4epegHou_nemyx 13.02.2019 18:38 # 0
guest8 15.02.2019 00:30 # −999
guest8 14.02.2019 23:56 # −999
guest8 15.02.2019 00:29 # −999
Kakou-mo_nemyx 15.02.2019 00:59 # 0
guest8 15.02.2019 01:12 # −999
MAKAKA 27.03.2020 16:55 # 0
KOPOHABuPYC 28.03.2020 01:55 # 0
guest8 14.02.2019 23:57 # −999
guest8 15.02.2019 00:28 # −999
guest8 15.02.2019 00:31 # −999
Elvenfighter 14.02.2019 00:25 # 0
Тем, кто пишет под такие вот платформы, думаю, не стоит париться о кросс-платформенности.
Steve_Brown 14.02.2019 10:31 # +5
который полностью соответствует стандарту
но при этом реализует все как попало - 7 бит в байте, 3 байта в инте, поля структуры хранятся в случайном порядке с паддингом, нулевой указатель имеет представление 42.
И заставить, чтобы все программы могли компилироваться под этот компилятор и работать.
O4epegHou_nemyx 14.02.2019 10:45 # 0
Kakou-mo_nemyx 14.02.2019 16:05 # +1
https://github.com/Battelle/movfuscator
Kakou-mo_nemyx 14.02.2019 16:21 # +1
https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf
Автор даже изобрёл ветвление на mov'ах. Пример:
В результате выполнения в ax будет лежать 1, если si=di, и ноль, если они не равны.
Kakou-mo_nemyx 15.02.2019 01:07 # 0
Kakou-mo_nemyx 15.02.2019 17:38 # 0
O4epegHou_nemyx 14.02.2019 16:41 # +1
Kakou-mo_nemyx 14.02.2019 17:16 # 0
Kakou-mo_nemyx 14.02.2019 17:26 # 0
Надо придумать эффективный способ выражения MOV через комбинации этих трёх инструкций.
На поверхности такой вариант: обнуляем регистр с помощью XOR или SUB самого с собой, потом с помощью XOR кладём в него новое значение.
Kakou-mo_nemyx 15.02.2019 01:53 # 0
guest8 14.02.2019 17:31 # −999
Kakou-mo_nemyx 14.02.2019 17:32 # 0
Kakou-mo_nemyx 15.02.2019 01:08 # 0
bormand 14.02.2019 11:55 # +3
31 бит в инте. А то получается, что padding биты в стандарте зря описаны и нигде реально не встречаются...
bormand 14.02.2019 12:00 # +4
bormand 14.02.2019 12:15 # +4
bormand 14.02.2019 12:09 # +2
bormand 14.02.2019 12:21 # +3
O4epegHou_nemyx 14.02.2019 12:27 # 0
bormand 14.02.2019 12:31 # 0
Что не помешало в boost preprocessor замутить конечные но достаточно юзабельные циклы.
O4epegHou_nemyx 14.02.2019 12:33 # +2
bormand 14.02.2019 13:25 # +2
guest8 23.02.2019 02:30 # −999
1024-- 14.02.2019 17:18 # 0
Т.е. вообще нельзя указатели сравнивать?
Если объекты разные, сравнивать нельзя; если одинаковые, то всё очевидно - не нужно сравнивать. Если неясно, то есть шанс, что объекты разные - нельзя.
guest8 14.02.2019 17:23 # −999
1024-- 14.02.2019 17:39 # 0
Но какой прок от этого? Разные массивы можно хранить в разных адресных пространствах?
UB ради UB, ограничивают полезные возможности.
guest8 14.02.2019 17:44 # −999
bormand 14.02.2019 18:54 # +2
Kakou-mo_nemyx 14.02.2019 21:00 # 0
guest8 23.02.2019 02:29 # −999
bormand 14.02.2019 13:33 # +1
gost 14.02.2019 13:46 # +2
bormand 14.02.2019 14:00 # 0
bormand 14.02.2019 15:16 # +1
Kakou-mo_nemyx 14.02.2019 15:53 # +1
http://www.libsf.org/li386/indexmain.html
CHayT 14.02.2019 15:56 # 0
Bapr_BuKePHeC 16.02.2019 15:57 # 0
3oJIoTou_xyu 16.02.2019 17:40 # 0
guest8 14.02.2019 16:23 # −999
Kakou-mo_nemyx 14.02.2019 16:31 # 0
CHayT 14.02.2019 15:55 # 0
Kakou-mo_nemyx 14.02.2019 17:35 # +4
>> но при этом реализует все как попало
Итальянская забастовка!
https://ru.wikipedia.org/wiki/Итальянская_забастовка
j123123 23.02.2019 00:59 # 0
Не выйдет, UCHAR_MAX нельзя будет записать. Он должен быть минимум 255.
guest8 14.02.2019 15:56 # −999
Koko 28.03.2020 18:22 # 0
KOPOHABuPYC 29.03.2020 22:10 # 0