- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
#include <stdio.h>
#define my_type unsigned short
int main(void)
{
my_type a = 0;
printf("%d\n", a);
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#include <stdio.h>
#define my_type unsigned short
int main(void)
{
my_type a = 0;
printf("%d\n", a);
return 0;
}
Экое извращение
http://govnokod.ru/user/25930/codes
Именно поэтому я за "Си".
Это какое-то очень смелое утверждение.
С спецификации сшечки нет ячеек стека, да и размер регистра не оговорен. Самый маленький кирпичик это char.
Хотя для большинства имплементаций ты прав.
> (кстати, почему на 64-битах инт остался 32-битным?
Смотря на каких. на x32-64 -- да. Может, потму что гамадриллы завязались на его размер, хотя уже очент давно есть uint8_t всякие
Именно поэтому я за «Си».
Кстати, именно поэтому на других процессорах можно обломаться, если выдвигать смелые предположения.
там есть автомутичсеская переменная
и все
А чот такое автоматическая переменная я не совсем понял, ты про сишный auto? Назуй он вообще нужен и как это отменяте существовование стека*+?
почитай стандарт. *
Это переменная, которая автоматически удаляется при выходе из блока.
>ты про сишный auto?
вообще нет
* кроме статьи в вики, есть даже видос
https://www.youtube.com/watch?v=63AM19ZYCYU
> Это переменная, которая автоматически удаляется при выходе из блока.
Ок, как такое делать без стека?
Видосы и индусы не нужны.
Ты случайно не из PHP конференции в Дрездене?
>Ок, как такое делать без стека?
Ну например явно удаляя что-то при выходе из блока:)
Стек тут это деталь реализации. Что не отменяет того факта, что примерно все реализации си используют именно стек
Сколько пушит сишка, зависит от коллконвеншона.
типа push ax?
Прочитал я про вариадические функции в сишке. Какое же говно...
В общем, если у функции в заголовке есть многоточие, то для всех неперечисленных аргументов вызывающий код производит повышение:
1. Все целые питухи, которые меньше инта, кастуются к инту.
2. Все плавающие питухи, которые меньше дабла (а их аж одна штука, а именно float), кастуются к даблу.
Т. е. при вызове макроса va_arg нельзя указывать типы char, short, float, int8_t и тому подобные. Можно указывать только типы, которые по размеру не меньше, чем int и double, а также указатели.
Какой размер имеет этот самый int, зависит от конкретного компилятора. Можно попасть в ситуацию, когда для какой-нибудь платформы есть несколько компиляторов и слинковать вместе сгенерированный ими код не получится.
Точно нельзя на x86 передавать структуру размером один байт, потому что вызывающий код запушит как минимум два байта, а тупой макрос va_arg прибавит к указателю единицу. Чтобы принять такую структуру, придётся дополнительно объявлять фиктивный тип размером в два байта.
Да вообще для всех структур нечётного размера придётся вводить фиктивный тип, округлённый до ближайшего чётного.
Если размер структуры нечётный, нужно явно объявить вспомогательный тип данных. Вручную мусорное поле можно и не добавлять, а прописать прагму для выравнивания (хотя нужно проверить).
Для X86 он округлит sizeof до размера, кратного инту; для AMD64 он округлит до размера, кратного void*; на остальных платформах пошлёт напитон.
ну кроме того одного гомика из Осетии
В общем, gcc на x86-32 структуры хранит плотно, но когда пушит, дополняет случайным мусором до четырёх байтов.
https://www.cartoonmovement.com/depot/cartoons/2019/08/25/g7_no_for_trumputin__marian_kamensky.jpeg