s54820
видать порт mingw игнорит эти моменты
Игнорит или нет, но мне больно это видеть.
Anonymous
понял, ну кодстайлы по си еще погляжу
s54820
long же в два раза больше int`а? Или я туплю.
sizeof(long) >= sizeof(int). В Windows их размеры равны, оба 4 байта.
Anonymous
и впрямь
Anonymous
да ладно, в чем ж смысл тогда
Anonymous
я всегда думал, что лонг он на то и лонг
Anonymous
что логее инда аж на 4 байта
Vladimir
long же в два раза больше int`а? Или я туплю.
На 32-битных архитектурах они оба 32 бита - 64 бита - это long long. На 64-битных int - 32, long и long long - 64
Anonymous
понял, запомню. Такой глупый косяк( Сорьки..
s54820
да ладно, в чем ж смысл тогда
Смысл в том, что разработчики ОС и компиляторов выбирают, как им удобнее. В 64-битном линуксе long 64 бита, например. В винде решили не расширять из-за кучи ээээ… плохого кода, поэтому даже в 64-битной винде long 32 бита, а если хочется 64 — есть long long.
Anonymous
понял, да
Yura
кстати народ подкажите, может зхнает кто короче. я удаленно отлаживаю винду (виндбг) у меня проблема с ком-портами, то есть по логике должно работать так: виртуалка пишет в файл, а виндбг читает оттуда, но проблема, что совместный доступ не работает то есть если я запустил виртуалку, то виндбг уже не может файл читать и наоборот... что делать?? P.S. я просто до этого отлаживал только 10, а в ней есть отладка через ТСР, там гораздо проще... а тут 7 пришлось отлаживать и такую гранату получил...
tanjmaxalb
Итого 64 выходит. Почему 32?
Vladimir
Двумя регистрами же заменяет?
Ну это как уж компилятору Бог на душу положит. Чаще всего - да, два регистра и флаг переноса
Anonymous
Блин, все работает. Ощущение приятно. Мощь темной стороны в моих руках. Теперь можной такой левел дермокодинка взять.. Ухххх
s54820
Итого 64 выходит. Почему 32?
Так это long long 64, а long 32.
Vladimir
s54820
Вроде стандарт только инт неоднозначно трактует
Стандарт у Си такой, что он всё неоднозначно трактует. Это основная проблема языка.
s54820
На 32-битном cpu
В винде любой разрядности.
tanjmaxalb
На 32-битном cpu
И на 64 тоже
Yura
как его создать на хосте
Vladimir
И на 64 тоже
Странно.
s54820
Остальные типы вроде однозначно определены
Однозначно только флоаты, да и то не совсем, и то только из-за IEEE-754. Там даже дополнительный код для знаковых интов не гарантируется. Но для типов фиксированных размеров есть stdint.h так-то.
s54820
ну как через пайп сделать?
Сказать в настройках COM-порта в VirtualBox, что путь к устройству \\.\pipe\somename?
tanjmaxalb
Странно.
На мою память, long 16-32 гарантирует
Yura
Сказать в настройках COM-порта в VirtualBox, что путь к устройству \\.\pipe\somename?
на хосте то как сделать? чтобы оттуда виндбг данные брал
tanjmaxalb
А long long более 32
Viktor
На мою память, long 16-32 гарантирует
На linux/macOS/bsd long 64 бита на 64битных машинах
Viktor
Это только в винде long 32 бита на 64битах
tanjmaxalb
tanjmaxalb
Это только в винде long 32 бита на 64битах
Стандарт одинаков ко всем ос
Vladimir
На linux/macOS/bsd long 64 бита на 64битных машинах
Хотя есть ещë такая штука, как ILP32 aka x32 abi
s54820
Это в стандарте сказано?
Это implementation defined, поэтому и отличается в зависимости от реализации и предпочтений разработчиков.
Vladimir
там лонги и поинтеры 32 бита
Viktor
Это в стандарте сказано?
В стандарте НЕ сказано, что long 16-32
Vladimir
short вроде везде 16
Viktor
char is at least 8 bits (1 byte by definition, however many bits it is) short is at least 16 bits int is at least 16 bits long is at least 32 bits long long (in versions of the language that support it) is at least 64 bits Each type in the above list is at least as wide as the previous type (but may well be the same).
Viktor
tanjmaxalb
На различных архитектурах по разному, на 16 битах лонг был
Vladimir
Еще __int128 есть.
Vladimir
Правда не везде.
Vladimir
И с long double нифига не понятно.
Viktor
Long до 32
https://godbolt.org/g/MzcLLC
tanjmaxalb
Нет, так это не работает:)
Viktor
С телефона не хочу это делать, но можешь ещё выбрать clang / msvc
tanjmaxalb
Компилятор, может изменить размерность, если по считает нужным
Viktor
Компилятор, может изменить размерность, если по считает нужным
Изменить так, что она перестанет соответствовать стандарту?
Viktor
Это откуда?
Базируется на стандарте, формулировку пару дней назад скопировал откуда-то, уже не вспомню
tanjmaxalb
Так это не будет противоречить стандарту
tanjmaxalb
Так long не всегда обязан быть 32
Viktor
Вы же сами сказали, что long обязан быть от 16 до 32 бит
tanjmaxalb
Да, но не ровно 32
Viktor
Это вообще как?
Viktor
Компилятор не меняет размеры просто потому что ему так захотелось
Viktor
ABI не просто так существуют
tanjmaxalb
Это от архитектура зависит!)
tanjmaxalb
С очень старый язык. Он не создавался априори для 32 или 64
Vladimir
Компилятор, может изменить размерность, если по считает нужным
В военное время sizeof(int) может достигать 48 бит.
s54820
ABI не просто так существуют
ABI — это внешний интерфейс. Если у компилятора контроль над вызывающим и вызываемым, внутри может быть что угодно.
s54820
В военное время sizeof(int) может достигать 48 бит.
Фиг бы с ним. Я однажды ковырял mp3-плеер с 24-битными чарами.
Viktor
ABI — это внешний интерфейс. Если у компилятора контроль над вызывающим и вызываемым, внутри может быть что угодно.
Функция не обозначена как static, так что она должна предоставлять внешний интерфейс
tanjmaxalb
Компилятор не меняет размеры просто потому что ему так захотелось
Компилятор действует исключительно в рамках стандарта. Стандарт даёт границы. Поэтому компилятор может хоть всегда делать инт по 16. И не будет конфликтовать со стандартом
Viktor
Но как это подтверждает "long имеет размер от 16 до 32 бит"?
Viktor
Ладно ещё если бы вы сказали "от 16 бит"
tanjmaxalb
Это опровергает ваш пример с компиляцией онлайн
s54820
tanjmaxalb
:)
tanjmaxalb
Ну это же константы)
Vladimir
Фиг бы с ним. Я однажды ковырял mp3-плеер с 24-битными чарами.
А в чем смысл 24-битных чаров? Что там за проц?
Viktor
Это опровергает ваш пример с компиляцией онлайн
Мой пример с компиляцией онлайн только показывает, что gcc считает, что размер long вполне себе может быть 8*8 == 64 бита