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

    0

    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
    22. 22
    23. 23
    24. 24
    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    
    int main(void)
    {
      uint32_t uint32max = UINT32_MAX;
      int32_t int32_minus_one = -1;
      printf("uint32_max = %" PRIu32 "\n", uint32max);
      printf("int32_minus_one = %" PRIi32 "\n", int32_minus_one);
      if (uint32max > int32_minus_one)
      {
        puts("uint32max > int32_minus_one");
      }
      else if (uint32max < int32_minus_one)
      {
        puts("uint32max < int32_minus_one");
      }
      else
      {
        puts("uint32max == int32_minus_one");
      }
      return EXIT_SUCCESS;
    }

    Почему в Си нет особого правила при сравнении signed и unsigned типов, ну типа если значение в signed типе отрицательно, то он полюбасу будет меньше любого unsigned значения? А то говно какое-то.

    (нет, я понимаю почему так происходит, но все равно говно)

    Запостил: j123123, 15 Февраля 2021

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

    • надо всего лишь добавить знание о типах в рантайм, и можно будет сделать
      Ответить
    • Потому что тип - это абстракция, процессор сравнивает байты, слова, двойные слова.
      есть разные инструкции - сравнить два знаковых и два беззнаковых числа. В процессорах, я думаю, нету операций смешанных сравнений.
      Ну и я думаю это одно из следствий статической типизации: типа и не предполагается, что будут сравниваться данные разных типов. Ну и действительно: зачем? Что может заставить сравнивать число, которое заведомо положительное с заведомо отрицательным? Как можно сравнить утку с кошкой? Квадрат с кругом? Разве что только по площади\объему, но площадь\объем - это тоже отдельный тип.
      То есть сравнение данных разных типов - говнокод, и, наверное багор (я хз смысл этого слова).
      Ответить
      • > В процессорах, я думаю, нету операций смешанных сравнений.

        В процессоре много чего нету. Что не мешает конпелятору составлять нужную операцию из нескольких.

        В данном случае можно было бы трактовать s > u как s >= 0 && s > u. Именно это программист обычно и имеет в виду перед тем как наступить на грабли.
        Ответить
        • Ну наверное так и не нужно делать, нужно структуры данных так продумать, чтобы и не приходилось думать о таких граблях.
          Читай мой второй абзац.
          Ответить
          • Ну да, именно поэтому в джаве оставили только знаковые числа. Чтобы не думать об этих граблях.

            Иначе конфликты неизбежны: в одной либе сделали координату как int, в другой как uint, а ты сиди и ебись теперь.
            Ответить
            • Знаковый size это тоже не то чтобы очень удобно
              Ответить
              • получилось много всякой чуши типа минус девятого элемента массива итд. Много чего проверяется в рантайме, а могло бы в компайл тайме

                За всё нужно платить
                Ответить
                • я могу понять обращение по отрицательному индексу, но отрицательный размер это уже за гранью

                  впрочем, я уже когда-то бугуртил по этому поводу
                  Ответить
                  • Всё норм. В массиве было -5 элементов, я обратился к -3.

                    -5 -4 -3 -2 -1
                    Ответить
                    • В классе было два человека, три из них вышло.
                      Учитель говорит: ну вот еще один придет, и вообще никого не останется
                      Ответить
                      • Какой short selling )))
                        Ответить
                        • Про тюльпаны знаешь?
                          *tulpenmanie
                          Ответить
                          • какая-то история про кризис первой голландской биржи?
                            Ответить
                            • да.

                              Прелесть в том, что фьючерсов (или как там называется право на покупку) на тюльпаны было продано больше, чем физически можно вырастить тюльпанов
                              Ответить
                              • Слышал, такую хуйню делают с билетами на самолёт. Продают билетов больше, чем вместительность. Всё равно кто-то не придёт.
                                Ответить
                  • это антиматерия
                    Ответить
              • Знаковый размер и знаковый индекс - это единственно правильное решение в дизайне вектора, например. То, что сделали крестоябляди - это говно, о котором они сами пожалели.
                У растоблядей тоже беззнаковый дерьмотип, но там не получится проебать выход за пределы при касте.
                Ответить
        • зачем компилятору делать лишнее действие? Это же си, тут считается, что программист сам понимает, что делает
          Ответить
    • Даже в шарпе такого правила нету, лол. Хотя вроде как высокоуровневый язык, не прибитый гвоздями к пирфомансу и архитектуре.

      Ну вернее для int'ов то оно есть (потому что в long кастуют), а вот long и unsigned long там тупо нельзя сравнить.
      Ответить
      • Типы ж разные, нехуй сравнивать. Пусть кодерок сам скажет, что делать.
        Ответить
        • это если кодерок в принципе вкурсе, что кроме "число" и "не число" бывают более конкретные типы
          Ответить
    • Пирфоманс важнее корректности. Лучше вернуть хуйню, зато быстро, без второго сравнения.
      Ответить
    •                                        Achtung!                                          

      Wir werden angegriffen! Alle posten besetzen. Ich wederchole: wir werden angegriffen!
      Ответить
    •                                        Achtung!                                          

      Wir werden angegriffen! Alle posten besetzen. Ich wederchole: wir werden angegriffen!
      Ответить

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