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

    −53

    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
    uint8_t CRC_1wire(uint8_t * crcbuff, uint32_t crcLen) {
    
            uint8_t Tabl_CRC[] = {0....};
            uint8_t crc = 0;
            uint32_t i;
    
            for (i = 0; i < crcLen; i++) {
                    if ((crc ^ (uint8_t) (crcbuff[i])) > 255) {
                            printf("ERROR CRC calc");
                            exit(-1);
                    }
                    crc = Tabl_CRC[crc ^ (uint8_t) (crcbuff[i])];
            }
    
            return crc;
    }

    never trust no one. sometime byte can be more than eight bits.

    Запостил: minixoid, 06 Февраля 2016

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

    • > sometime byte can be more than eight bits
      Ну формально могут, стандарт позволяет. Если поискать - наверное даже найдёшь какую-нибудь DSP'шку с 32/64-битным байтом. Но там этот код просто не скомпилится, т.к. uint8_t там не будет.
      Ответить
      • Байт, или слово?
        Ответить
        • Цитата из стандарта си: A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined.

          Кстати, по этой же причине во всяких RFC пишут не "байт", а "октет".
          Ответить
        • В С++ байт это конструкт абстрактной машины. Если нативно слово целевой архитектуры больше 8 бит и адресация индивидуальных октетов неоправданно дорога, компилятор вполне может установить размер байта = размеру слова.
          Ответить
          • uint8_t видим?
            Ответить
            • В данной ветке мы обсуждаем теоретическую возможность байта быть больше восьми бит и конкретно истинность фразы "sometime byte can be more than eight bits".

              Сам код здесь никому не интересен.
              Ответить
              • нуну
                Ответить
              • человек очень тонко (но до безобразия настойчиво) намекает что тип uint8_t не должен содержать более 8 бит потому что у него в названии стоит 8.
                Ответить
                • У uint_fast8_t тоже в названии 8
                  Ответить
                  • и что из этого следует?
                    Ответить
                    • > и что из этого следует?

                      Из этого следует, что вы делаете правильные выводы из неправильных предпосылок.
                      Надо смотреть, что написано в стандарте, а не угадывать поведение исходя из циферки в типе.

                      В стандарте С99 написано
                      7.18.1.1 Exact-width integer types
                      1. The typedef name intN_t designates a signed integer type with widthN, no padding bits, and a two’s complement representation. Thus, int8_t denotes a signed integertype with a width of exactly 8 bits.
                      2. The typedef name uintN_t designates an unsigned integer type with widthN. Thus, uint24_t denotes an unsigned integer type with a width of exactly 24 bits.
                      3. These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two’scomplement representation, it shall define the corresponding typedef names.

                      Т.е. uint8_t если есть, то содержит ровно 8 бит. Потому, что так говорит стандарт, а не потому, что в названии типа есть цифра 8.
                      Ответить
                • да бросьте вы... какое ж тут безобразие... безобразие - это комментаторы типа "В данной ветке мы обсуждаем теоретическую возможность блаблабла"... вы просто ничего не понимаете в безобразиях, хотя оные - дак вот жеж они, прям перед носом.
                  Ответить
                  • Да чё ты так распереживался за эту проверку то... Компилятор поди прекрасно всё понял, и выкинул её нахуй вместе со строкой, printf'ом и exit'ом.
                    Ответить
                    • Раз: warning: comparison is always false due to limited range of data type
                      Два:
                      .L3:
                          xorb    (%rdi), %al
                          addq    $1, %rdi
                          cmpq    %rdx, %rdi
                          movzbl  %al, %eax
                          movzbl  (%rsp,%rax), %eax
                          jne     .L3
                      gcc умеет махать шашкой :)

                      P.S. Как же ему, бедному, трудно работать с октетами... Напишешь movb (%rsp, %rax), %al - создастся ложная зависимость от старого значения eax, код медленнее станет...
                      Ответить
                      • о, тут особо продвинутые нарисовались... тоже не веришь, что если написано uint8_t, то оно никак не может быть больше, чем 0xFF?

                        вдрух xorb или ещё какой-нить там LD/ST сглючит, не туда запишет...
                        Ответить
                        • > тоже не веришь, что если написано uint8_t, то оно никак не может быть больше, чем 0xFF
                          Да у тебя же баттхерт.

                          > вдрух
                          Ну если UB будет где-нибудь выше по коду - там и не такая гадость вылезти может...

                          Ну написал чувак эту проверку. Ну ок, лишняя. Но это же тривиально и скучно. Гцц вон даже ворнинг на неё показывает. В итоге по теме сказать нечего, вот и обсуждаем всякую фигню вокруг да около.
                          Ответить
                          • показать все, что скрыточего у меня?... батшто? у нас тута есть спецы по аглицой мове, фсякие там тонкости про самтайм прочухали... а тута ты со своим "ворнингом"... чо, вломы написать "предупреждение"?

                            >> Ну написал чувак

                            две ашыпки. вместо "ч" должно быть "м", а вместо "в" должно быть "д".

                            >> Но это же тривиально и скучно

                            тем не менее, тех, кто начинается с буквы "м", надо ставить на место.

                            >> вот и обсуждаем всякую фигню вокруг да около

                            ну давай нефигню обсуждать...
                            Ответить
                    • эх, ещё б компилятор научился бы выкидывать фтуды мудил, которые пишут такие "проверки"
                      Ответить
        • uint8_t
          Ответить
      • я и говорю - uint8_t - это типа чтоб никто не догадался, что оно ">255"
        Ответить
        • А если байт 16-битный и
          // defs.h
          #ifdef OLD_COMPILER
          typedef char uint8_t;
          #endif

          ...
          #include <defs.h>
          uint8_t a = 1000;
          Ответить
          • В таком случае компилятор не соответствует стандартам. uint8_t обязан быть размером ровно 8 байт. Если такой возможности нет, то этого типа не должно быть. Благо все fixed-width типы опциональны.
            Ответить
            • Так у него тогда в коде ошибка, а не в компиляторе.
              Ответить
    • crc32 через lookup table это же классика жанра.
      Ответить
    • ндас, весёленькие вы тутова. я прекрасно знаю про машины с шестибитным размером слова. но если написано uint8_t, то, видимо, число бит в таких переменных равно 8, об этом какбэ намекает нам символ "8". и совершенно нет никакой необходимости проверять, что значение переменной, на которую отведено 8 бит, вдрух может превысить 255.

      не, я понимаю, что бывают мудаки, которые пишут 8, а "на самом деле" 9, но не до такой же степени, господа "программисты"
      Ответить
      • Это ещё повезло. Тут может ВНЕЗАПНО развернуться жуткая политота. А здесь всего лишь придирка к фразе, причём почти по теме.
        Ответить
        • ну почему бы и нет, пускай развёртываеццо. политота-то. авось, глядишь, таки порешат вселенский вопрос о количестве ангелов на кончике... oops... количестве битОВ в переменной, состоящей из восьми битов.

          а мне по нраву обозначения в стиле 'u8", писать удобнее .)
          Ответить
    • а давайте устроим голосование, ы? на повестке дня животрепещущий вопрос - сколько же битОв в переменной
      типа uint8_t?

      предлагаю следующие варианты ответов

      - для меня это очень сложно, я только до тлёх считать научился
      - 11 (в десятичной системе счисления)
      - зависит, с какой стороны посмотреть
      - 11 (в семяричной системе счисления)
      Ответить
      • пригорело?
        В топике написано
        > sometimes byte can be more than eight bits.
        Формально это так, в "байте" в том смысле, которым его понимает стандарт, может быть больше 8 бит.

        Пруфы из стандарта:

        3.6
        1 byte
        addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
        2 NOTE 1 - It is possible to express the address of each individual byte of an object uniquely.
        3 NOTE 2 - A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit;the most significant bit is called the high-order bit.


        > в переменной типа uint8_t
        А вот тут уже может быть только 8 бит.

        Это ты сам перепутал байты и uint8_t.
        Ответить
        • >> int8_t denotes a signed integertype with a width of exactly 8 bits

          чо, серьёзно? блин, я не верю!!! вдруг 9 - и тогда >255
          докажи, что в переменную размером 8 бит может влезть число 555... давай, смелее, пианэр.
          Ответить
          • А вы знали, что если сделать всего 6 опечаток в слове uint8_t, получится слово byte?
            Ответить
          • > докажи, что в переменную размером 8 бит может влезть число 555... давай, смелее, пианэр.
            Количество бит - это количество уменьшений неопределённости вдвое, числа здесь - штука побочная.
            Я могу впихнуть 555 даже в однобитовую переменную. Скажем, если true, то 555, если false, то 91.
            bool number = false;
            if(number) print(555);
            else print(91);
            Ответить
            • А если всё множество чисел состоит только из числа 555, то и в 0 бит можно уложиться.

              P.S. Кстати, тебе не попадались 8-битные флоаты? https://en.wikipedia.org/wiki/Minifloat
              Ответить
              • Еретик на сайте! На кол, четвертовать, сжечь!
                Ответить
              • 8-битные флоаты мне не попадались

                > и в 0 бит можно уложиться
                Интересно, до чего можно дойти с таким настроем?
                Нулевой шаг - биты формируют число, записанное в двоичной системе.
                Первый шаг - уменьшение битности для разрежения покрываемого диапазона.
                Второй шаг - ноль бит для определённого числа, перенесение значения числа в "голову".
                Дальше можно, скажем, задать в C++ struct one; struct zero; typedef<typename x, typename y> struct bitand { ... }; и т.д. и перенести вычисления в метапрограмму.
                Был ещё вероятностный счётчик, который без всяких грязных трюков с метаинформацией честно использовал n>0 бит, чтобы посчитать до 2^(n+k), k>0.
                Ответить
              • У нас тут условия такие и погода такая что 8ричные ассемблеры встречаются WCT

                ПС - семен сменил ник на minixoid?
                Ответить
        • не умничай,

          http://www.grammarly.com/handbook/grammar/adjectives-and-adverbs/19/sometime-sometimes-and-some-time/
          Ответить
          • Я даже открыл и прочёл. Не понимаю, что тебя возмутило в поправке:
            sometime = когда-нибудь
            sometimes = иногда
            some time = в течении какого-то периода времени.

            Если пишешь sometime, то пиши в Future Simple, блджад.
            Ответить
        • Вот чтобы не пригорало - во всяких RFC пишут октет и не парятся ;)
          Ответить
          • показать все, что скрытоты с дуба рухнул? "октет" - это же для особо умных, тут жеж непонятно, что какбы восемь. ведь могут перепутать с "октавой", которая какбы восемь, но в то же время двенадцать. а "октябрь" - ваще десятый месяц. но таки "окт".

            поэтому для особо грамотных специально придумали symbol такой - 8, дак и то тупняк на говнокоде
            Ответить
          • Чтобы не пригорало, нанесите антипригарное покрытие.

            ~Ваш кэп~
            Ответить
    • показать все, что скрыто> в переменной типа uint8_t
      >> А вот тут уже может быть только 8 бит.

      да вы гоните. не может такого быть, чтобы в переменной типа uint8_t было 8 бит, это же бред полный. все комментаторы уже давно осознали, что их там может быть сколько угодно, например, 5. или 7. или 11. или вы всё ещё тупите?
      Ответить
    • показать все, что скрыто>> Если пишешь sometime, то пиши в Future Simple, блджад

      чойта я мальца обшибся в ацэнке шыроты контингента... аказываеццо, тутоньки не только "программисты" и "юмористы", а ишшо и "лингвисты"... прям не знаю, куда девацца

      ну, написал бы я "sumtyme byte can bloat upto 123 bits"...
      к какой букофке ты бы прикопался?
      Ответить
    • показать все, что скрытоо, казалось бы, совершенно безобидное слово, byte.
      и столько лишних нажатий на клавиатуру.

      я представляю, какой бы srach случился, если б я написал
      megabyte, или, боже упаси, мибибайт.

      тут, блин, с uint8_t, как выяснилось, "проблемы"... зайобибайтим енто дело, любители "стандартов"?..
      Ответить
    • Уймись, упоротый.
      Ответить

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