На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Вывод 2-байтного на экран в HEXе
    Вывожу:
    ExpandedWrap disabled
      short x=-341;
      printf("%04X",x);
    Выводится:
    ExpandedWrap disabled
      FFFFFEAB
    А надо только
    ExpandedWrap disabled
      FEAB
    Как быть?
    П.С. в 64-битном компилю в вижуалке 2019.
      ExpandedWrap disabled
        #include <iostream>
        #include <iomanip>
         
        int main() {
          short x=-341;
          std::cout << std::setw(4) << std::uppercase << std::hex << x << std::endl;
          return 0;
        }
        Всё хитрее решилось:
        ExpandedWrap disabled
          short x=-341;
          printf("%04X",*(unsigned short*)&x);
        Но почему алгоритм нарушал заданое ГОСТом ограничение в 4 символа?
          Цитата Славян @
          Всё хитрее

          ExpandedWrap disabled
            short x=-341;
            printf("%04X",(unsigned short)x);

          :lol:
            Цитата Славян @
            Но почему алгоритм нарушал заданое ГОСТом ограничение в 4 символа?
            Это строго по "ГОСТ"у. Эллипсис подразумевает integral promotion аргументов, поэтому short кастуется к int. Естественно, что ты видишь знаковое расширение. Если тебя интересуют только четыре символа, либо сделай каст к беззнаковому, чтобы расширение было нулём, либо используй модификатор типа h.
            Сообщение отредактировано: Qraizer -
              Копец, хитрый Джо! :good:

              Добавлено
              Цитата Qraizer
              Это строго по "ГОСТ"у.
              А поподробнее можно? Я к тому, что явно же задан МАКСИМУМ в 4 символа, а пишет 8. Как так?
                Потому что длина указывает минимальную ширину, а не точную. Если хочешь описание в Стандарте, укажи какой язык и ревизию хочешь. А так, ищи по ключевым словам "integer promotions", "integral promotions" и "ellipsis".
                  Цитата Qraizer
                  Потому что длина указывает минимальную ширину
                  Блин, действительно! Был уверен, что это максимум. Виноват.
                    Цитата Славян @
                    Всё хитрее решилось:
                    ExpandedWrap disabled
                      short x=-341;
                      printf("%04X",*(unsigned short*)&x);
                    Но почему алгоритм нарушал заданое ГОСТом ограничение в 4 символа?

                    еще вариант есть
                    ExpandedWrap disabled
                           short x=-341;
                           char str[50];
                           sprintf(str, "%04X ", x);
                           puts(str+4);
                      Цитата sergioK
                      еще вариант есть
                      Это отстойный вариант, ибо если x неотрицательное, то на экран ваш метод токмо пробел и выдаст.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0320 ]   [ 17 queries used ]   [ Generated: 19.04.24, 20:16 GMT ]