1. Си / Говнокод #19590

    −49

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    int reverse(int x) {
        long int a=x;
        if (a<10 && a>-1) return a;
        int kol=2,k=1,i;
        long int sum=0;
        if (a<0) {
            k=-1;
            a=(-1)*a;
        }
        long int num=a;
        while (true){
            if ((num/=10)>9)
                kol++;
            else break;
            }
        for (i=0;i<kol;i++){
            sum=10*sum+a%10;
            a/=10;
        }
        return sum*k;
    }

    реверс числа

    Запостил: JeeOpp, 08 Марта 2016

    Комментарии (100) RSS

    • a=(-1)*a;


      Ну привет, UB.
      Ответить
      • разве есть компиляторы, которые не заменят это на a = ~a+1?
        Ответить
        • А почему не a = -a ?
          Ответить
          • потому что -a делается через ~a+1
            Ответить
            • >компиляторы, заменят это на a = ~a+1?
              Эээ. NEG

              >потому что -a делается через ~a+1
              Да неужели?
              Ответить
              • С тем, что существует специальный опкод (NEG), согласен.

                А обратный код применяется только на экзотических платформах (типа Unisys ClearPath, см. ниже).

                На более распространённых процессорах 1111=-1. Хотя возможность того, что когда-нибудь придётся писать под Unisys, упускать тоже не сто́ит.
                Ответить
                • Фу, нуб, 1111 равно 15, а не -1!!! Даже в 8-битном типе!!!
                  Ответить
                  • Да, в 8-битном типе будет 15. Но мы с 3.14159265 обсуждали четырёхбитную архитектуру.
                    Ответить
                    • А, 4-битный проц, да, точняк
                      Ответить
                      • Смех смехом, а в микрокалькуляторах применяется 4-битная адресация и BCD, в котором каждая цифра занимает 4 бита.
                        Ответить
                        • >BCD
                          и каким образом там 1111 будет -1?
                          Ответить
                          • Всё верно, на микрокалькуляторе никак не будет. Ведь там каждая десятичная цифра беззнаковая, а число в целом представлено в виде знак + модуль (так проще отображать его на экране).

                            Выручайте! Придумайте, где могут понадобиться четырёхбитовые знаковые числа.
                            Ответить
                            • Четырёхбитовый флоат (для каких-нибудь грубых настроек):

                              0000 = 0, 0100 = 1, 0101 = 2, 0110 = 4,
                              0111 = 8, 0011 = 0.5, 0010 = 0.25, 0001 = 0.125
                              1000 = -0, 1100 = -1, 1101 = -2, 1110 = -4,
                              1111 = -8, 1011 = -0.5, 1010 = -0.25, 1001 = -0.125
                              Ответить
                              • Однобитовый флоат мало чем отличается от однобитового инта
                                Ответить
                                • Из-за знака в него влезут только 0 и -0 :)
                                  Ответить
                                  • интересно, а чему равно -0+0? )
                                    Ответить
                                    • >интересно, а чему равно -0+0? )

                                      Тебя разве мама не учила что любое число при сложении с нейтральным элементом поля Галуа (нулём) даёт само себя.

                                      (-0)+0=-0.

                                      proof

                                      0000 = 0
                                      1000 = -0
                                      -0+0 =-0
                                      0000+1000=1000
                                      Ответить
                                  • NaN и NaNaN.
                                    Ответить
                                    • NaN надо было т.н. число Тараса задать.
                                      Чтоб путаницы с нулями не было.
                                      Ответить
                              • >Четырёхбитовый флоат
                                Банально как-то. 3 бита мантиссы и бит знака.

                                В смысле толку-то. Так-то можно оперировать целыми питухами, неявно помня про логарифмическую шкалу.
                                Ответить
        • Чисто гипотетически кроме дополнительного кода (two's complement) могут существовать и другие. Например, плавающий питух представляется прямым кодом с отдельным знаковым битом.
          Ответить
          • а "чисто практически" такие компиляторы существуют?
            Ответить
            • http://stackoverflow.com/questions/12276957/are-there-any-non-twos-complement-implementations-of-c
              Ответить
              • > OS 2200
                > Latest release: ClearPath OS 2200 Release 16.0 / February 27, 2015
                > 36 bit words
                > CHAR_BIT == 9
                > ones complement
                > 72 bit non-IEEE floating point
                > separate address space for code and data

                Страшный сон говнокодера.
                Ответить
                • Параметры весьма сексуальны, а где применяется?
                  Ответить
                  • Вот более прямые ссылки:
                    http://www.unisys.com/offerings/high-end-servers/clearpath-forward-systems/clearpath-forward-dorado-systems

                    https://en.wikipedia.org/wiki/UNIVAC_1100/2200_series#UNISYS_2200_series
                    Ответить
                • Кстати сейчас читаю доку по циклоняшке...

                  Оказывается, там умножители могут работать в режиме 9х9 бит и 18х18 бит. А встроенные блоки памяти умеют ширину в 9, 18 и 36 бит... К чему бы это?
                  Ответить
          • Кстати нащот тильдочки уже срались тут.
            Типа результаты indexOfов таки кощернее сравнивать с ~0, а не -1.

            http://www.cplusplus.com/reference/string/string/find/
            size_t is an unsigned integral type (the same as member type string::size_type).
            Ответить
            • > Типа результаты indexOfов кощернее сравнивать с ~0, а не -1

              Кощернее сравнивать с std::string::npos и не умничать.
              Ответить
              • >Кощернее сравнивать с std::string::npos и не умничать.

                static const size_t npos = -1;

                size_t is an unsigned integral type


                Спасибо, не надо.

                Не устаю поражаться крестоблядскому упорству. Обосраться на ровном месте получить underflow и/или конвертацию signed в unsigned прямо в документации.
                Ответить
                • А если завтра скажут static const size_t npos = ~0 - 1; ты пойдешь с лупой по коду гулять?
                  Ответить
                  • >А если завтра скажут static const size_t npos = ~0 - 1;

                    Тогда они еще большие мудаки чем можно себе представить. Потому что (~0 - 1) ни разу не largest possible representable value.
                    Впрочем крестоблядкам не привыкать подъедать неортогональную блевотину сиплюструпа.
                    Ответить
                • Думаю, что на хитрожопых рахитектурах это число реализовано как-нибудь иначе
                  Ответить
                  • Спокуха, там дальше примечание:

                    This constant is defined with a value of -1, which because size_t is an unsigned integral type, it is the largest possible representable value for this type.

                    Выдающаяся Щизофрения в одном предложении штандарта.
                    Ответить
                    • Для тех, кто привык к слабой типизации сишечки (причём без автопреобразования типов, в отличие от "PHP"), это обычное явление.
                      Ответить
                    • Ахаха, а вот это они слажали. Ну так тут уже выяснили, что труп страуса - говнокодер, так что хуль удивляться.
                      Ответить
                • > Спасибо, не надо.

                  Что значит не надо?

                  find и прочее явно декларируют, что возвращают npos в случае неудачи. Можешь сравнивать с чем-то другим, но тогда ССЗБ.

                  Эквивалент -1 там или -42 - дело, не имеющее большой практической важности.

                  > static const size_t npos = -1;
                  В либе gcc там явный каст:
                  static const size_type npos = static_cast<size_type>(-1);
                  Ответить
                  • >Что значит не надо?
                    То что беззнаковая -1 оксюморон. Она не нужна.


                    >В либе gcc там явный каст:
                    >static const size_type npos = static_cast<size_type>(-1);

                    Костыли-костылики. На какие только люди не идут ухищрения, чтобы не использовать побитовое отрицание или знаковые числа.
                    Ответить
                    • Я один раз вляпался в bitset<1 << 31 >, вот это было эпичненько.
                      Ответить
                      • КРЕСТОПРОБЕЛЫ

                        А можно используя крестобляские крестошаблоны заставить крестокомпилер выдать ошибку когда вылезешь out of bounds?
                        Ответить
                        • да
                          template <typename Type>
                          class pragmatic_integral : public Type {
                          //...
                          
                          std::enable_if<std::is_signed<T>::value && std::is_integral<T>::value && !std::is_same<Type,T>::value && !std::is_signed<Type>::value> operator = (T value) {
                              if (value < 0)
                                  throw std::invalid_argument("Cannot set negative value to unsigned integral type");
                              if (value > std::numeric_limits<Type>::max)
                                  throw std::invalid_argument("Integral type overflow");
                              *this = static_cast<Type>(value);
                          }
                          //...
                          }


                          Для других случаев по аналогии
                          Ответить
                • А зачем Вам читать исходники их питушни? Предоставили npos, а реализацию сокрыли, дали интерфейс. Константа есть, тип её есть, всё в порядке.
                  Ответить
                • > конвертацию signed в unsigned
                  Как что-то плохое. Она определена стандартом. Число загоняется в допустимый диапазон добавлением/вычитанием соотв. степени двойки. Всего то.
                  Ответить
                  • Ой ли? А не тупо битовым копированием?
                    Ответить
                    • Сишечка ещё может флоат в инт побитово скопировать. Интересно, какую формулу для этой операции подберут математики.
                      Ответить
                    • Да. Но это чит который работает только для twos-complement представления. Для всяких sign+magnitude будет не так тривиально.
                      Ответить
                      • Хотя... Компилятор же никто не заставляет юзать команды, которые работают со знаковыми числами. Он может запилить свой twos-complement signed с блекджеком и шлюхами из... беззнаковых чисел. Проблемы могут быть разве что с умножением да делением...
                        Ответить
                      • Оверхед какой-то получается. Неидеологично.
                        Ответить
                  • Как же тогда бывает перехлест? Поцчему большой ансайнд превращается в отрицательное?
                    Ответить
                    • Читай внимательно: конвертацию signed в unsigned

                      unsigned в signed как раз и не определена.
                      Ответить
                      • Який підрозділ стандарту це твердить?
                        Ответить
                        • 4.7 Integral conversions

                          > 2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [ Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation) . —end note ]

                          > 3 If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.

                          результат signed → unsigned чётко установлен стандартом, результат unsigned → signed установлен стандартом, если значение пожно представить в целевом типе. Иначе мы отданы на милость разработчиков компилятора.
                          Ответить
                          • Несимметричный стандарт...

                            Но из него следует, что two's complement — самое естественное представление чисел со знаком, остальные — от лукавого.
                            Ответить
              • Кошернее всего послать нахуй эту ебучую беззнаковость, и брать -1, чем думать "какое же число брать для не-индекса". Не рассказывайте, как вам нужны массивы на 4 лярда.
                Либо послать нахуй нумерацию с нуля. Тогда вообще будет охуенно - нуль - это и указатель в никуда, и индекс в никуда.
                Ответить
                • Пресловутая -1 на разных рахитектурах может и не являться максимальным беззнаковым значением.
                  Ответить
                  • Я про то, что если индекс в векторе сделать знаковый, то можно спокойно знать, что -1 - это "плохой индекс". И не думать, какое у него блять битовое представление.
                    Ответить
                    • Может ну его и на пыхе?
                      Ответить
                    • >Я про то, что если индекс в векторе сделать знаковый, то можно спокойно знать, что -1 - это "плохой индекс".

                      Согласен.
                      Обосрались конкретно с миксом знаковости/беззнаковости.

                      Вот size_t допустим 16.
                      65534 - еще индекс. 65535 - уже not found.
                      Ответить
                  • Для беззнаковых чисел же жёстко установлено поведение при over/underflowю Почему их и не советует использовать, если это поведение не нужно: на платформах где такое поведение не естественно на эмуляцию потратится слишком много ресурсов.
                    Ответить
                    • -1 это знаковое число. И его кастят в беззнаковое.
                      Ответить
                      • И для каста тоже поведение определено. В 4.7/2.
                        Ответить
                        • А это не нарушение основ типа "не полагаемся на поведение конкретной реализации, чтоб не заниматься эмуляцией в других"?
                          Ответить
                          • Это "нужно, чтобы хоть что-то работало ожидаемо". Поэтому и не советуют использовать беззнаковые числа для арифметики.

                            Кстати, стандарт завязан на двоичные компьютеры. Для троичных/десятичных/... придётся другой язык выдумывать или эмулировать.
                            Ответить
                            • Ага, то есть переполнение беззнаковых - от балды какое, а вот каст беззнаковых в знаковое - тут надо эмуляцию нахреначить.
                              Ответить
                              • *знаковых в беззнаковые

                                беззнаковые в знаковые implementation-defined, aka "делай, что быстрее"
                                Ответить
                • Паскалист
                  Ответить
                  • Да.
                    Ерланг тоже с 1 нумерует. Оказывается, не зря.
                    Ответить
            • Чот какая-то дикость.

              А вдруг элемент чисто гипотетически находится на позиции 2^n-1.

              According to the 1999 ISO C standard (C99), size_t is an unsigned integer type of at least 16 bit (see sections 7.17 and 7.18.3).

              Что вполне реально, кстати.
              Ответить
              • Чисто гипотетически максимальный размер массива может быть меньше, чем максимальное значение size_t (на визуалке так, в два раза. Подозреваю, что внутренние аллокаторы винды берут таки знаковое значение). И всяческие string/vector/etc ::max_size() тоже ограничены специально.
                Ответить
                • внутренние аллокаторы берут беззнаковое значение потому что иначе размер адресуемой оперативной памяти на х32 платформах был бы не 4гб а 2гб.
                  Ответить
                  • Но ось один фиг обрубает на 2 (в лучшем случае - на 3).
                    Ответить
                    • знаковым ты даже 3 гб не адресуешь. У меня на одном из компов вин32 адресует 4 гб из 8.
                      Ответить
                    • не обрубает, а мапит туда всякие свои библиотеки

                      не всёж под кучу отдавать, должен же еще лоадер туда user32, advapi итд загрузить
                      Ответить
                      • Ещё как обрубает. Ибо в верхней части адресного пространства у большинства операционок живут йадро и дрова.

                        > лоадер туда user32, advapi итд
                        Ну т.е. даже 2 гига процессу не достанется...
                        Ответить
                        • >>user32, advapi итд загрузить
                          >>части адресного пространства живут йадро
                          не тоже ли самое?

                          Вот про дрова не понял

                          Ну и еще чтобы не оказалось что мы о разном: мы говорим о виртуальном адресном пространстве программы (не ядра!), да?
                          Ответить
                          • > мы говорим о виртуальном адресном пространстве программы
                            Так точно. И оно в дефолтной конфигурации винды простирается от 0 до 0x7FFFFFFF (вроде можно переключить каким-то ключиком на 0..0xBFFFFFFF).

                            А всё что выше - ядерная область, которая во всех процессах замапана одинаково. И непривилегированному коду туда путь заказан - за попытку обратиться по виртуальному адресу 0x80000000 и выше прогу тупо убьют (ну или вбросят SEH, ок).

                            Или я туплю и там не так?

                            З.Ы. user32, advapi - самые обычные юзермодные дллки. Ты сам такие можешь написать. Даже ntdll никакой магии в себе не содержит.
                            Ответить
                            • да, именно так
                              присловутый ключик ядра /3gb еще со времени win2k
                              Ответить
                  • Какое отношение аргумент "сколько памяти выделить одним куском" имеет к адресуемой памяти? Ничто не мешает аллокаторам брать знаковое 16битное число на 64битных архитектурах и в сумме выделять терабайты.
                    Ответить
          • Ололо
            Я и не знал что бывают не иееешнве питухи
            Ответить
      • Так-то и i++ - UB;
        Ответить

    Добавить комментарий