Про целочисленные типы
Apr. 5th, 2016 10:38 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Интересно, что количество бит в самом большом целочисленном типе, поддерживаемом современными компиляторами (int128_t), уже сравнялось с максимальным значением самого маленького (signed char).
Это к вопросу о том, как интерпретировать x << -1.
Мне пришли в голову две «естественные» интерпретации:
1. x << -1 = x >> 1.
2. x << -1 = x<< ((usigned что-то)-1) = x << 255 или x << 65535 и так далее.
В обоих случаях 1 << -1 = 0.
Но не все компиляторы с этим согласны. (понятно что по стандарту это undefined behavoir).
Это к вопросу о том, как интерпретировать x << -1.
Мне пришли в голову две «естественные» интерпретации:
1. x << -1 = x >> 1.
2. x << -1 = x<< ((usigned что-то)-1) = x << 255 или x << 65535 и так далее.
В обоих случаях 1 << -1 = 0.
Но не все компиляторы с этим согласны. (понятно что по стандарту это undefined behavoir).
no subject
Date: 2016-04-05 09:07 am (UTC)- ошибок обновления компилятора. Так как сегодняшняя версия компилирует один код, а завтрашняя - другой. Просто из-за того, что поведение undefined - никто не тестировал.
- ошибок обновления кода. Опять же - при редактировании собственной программы автор не задумывается о данном кусочке, ичто он изменит работу.
- ошибок несовместимости архитектур ПРОЦЕССОРА - "на x86 работаем, на x64 нет" хотя бы
- ошибок различия сред исполнения. Пример из реальной жизни - одна и та же ДОС/Win95 программа, запущенная в досбокс в современной Windows. Ещё смешнее - одна и та же программа, запущенная в английской и русской версиях операционки. Достаточно ОДНОГО национального символа в одном пути к файлу чтобы получить потрясающие спецэффекты.
no subject
Date: 2016-04-05 09:26 am (UTC)А через двадцать лет появляется новый компилятор который на это говорит "фу". Я тут было дело недавно правил подобного рода конструкцию в catdoc. Не помню зачем я ее написал во времена turbo C 2.0, но вот CLang на 64-битной архитектуре жрать отказался.
Но вообще когда у тебя "на x86 работаем, а на x64 нет", это полбеды. Вот когда "на x86 работаем, на x64 работаем, на ARMv5 работаем, а на ARMv7 внезапно нет"...
no subject
Date: 2016-04-05 09:40 am (UTC)no subject
Date: 2016-04-05 12:58 pm (UTC)no subject
Date: 2016-04-05 01:09 pm (UTC)От разных endianness тоже, кстати.
И вот такой код
struct A {
whatever1 x;
whatever2 y;
whatever3 z;
} a[2];
write(fd, a, sizeof(a));
может нанести немало неожиданностей даже для типов whatever... из этой библиотеки.
no subject
Date: 2016-04-05 03:14 pm (UTC)no subject
Date: 2016-04-05 03:27 pm (UTC)