Странный вывод списка __int64

у меня проблема с __int64 а также %I64u, или может быть есть проблема с моей формулой. я пытаюсь имитировать вывод ниже. но в некоторых позициях происходят странные вещи. я не могу понять, что случилось, так как другие были напечатаны нормально.

ПРИМЕЧАНИЕ: основным источником этого списка являются двоичные необработанные данные. так что я взял его из шестнадцатеричного кода и пытался преобразовать его в __int64, мой список состоит из 120 позиции, которые хорошо выводятся на линию 73 и сбой с линии 74 с ожидаемым значением 2276812558 и отображается 18446744071691396878, С линии 74 до линии 120 результаты intermittent, другие в порядке, и другие линии терпят неудачу.

кто-нибудь помочь ??

ИСТОЧНИК:

74  2276812558     <-- expected output
...
110 88343310421     <-- expected output
111 101677534814    <-- expected output
112 116372862414
113 132547934111    <-- expected output
114 150330130721
115 169856101434    <-- expected output
116 193905458276
117 220253625665
118 249089120712    <-- expected output
119 280613529205
120 315042247217

вот мой код:

    longint =  (__int64)((col[3] << 24) | (col[2] << 16) | (col[1] << 8)) | ((col[0]) | (__int64)((col[7] << 56) | (col[6] << 48) | (col[5] << 40) | (col[4] << 32)) << 32);
sprintf(longintbuf,"%I64u", longint );

.Генерируемый выход

74  18446744071691396878    <-- err
...
110 18446744071858548821    <-- err
111 18446744072307871326    <-- err
112 116372862414
113 18446744073113499551    <-- err
114 150330130721
115 18446744071766961210    <-- err
116 193905458276
117 220253625665
118 18446744073690569160    <-- err
119 280613529205
120 315042247217

1

Решение

если col это не массив 64-битных типов, ваши изменения вызывают неопределенное поведение. В ролях перед сдвигом:

(__int64)col[7] << 56

Это также неопределенное поведение, если сдвиг вызовет изменение знака, поэтому будьте осторожны при использовании подписанных типов (таких как вы).

От C11 6.5.7 Битовые операторы сдвига (выделение мое):

Целочисленные продвижения выполняются на каждом из операндов. Тип результата — тип повышенного левого операнда. Если значение правого операнда отрицательно или больше или равно ширине повышенного левого операнда, поведение не определено.

Результат E1 << E2 является E1 сдвинуты влево E2 битовые позиции; освобожденные биты заполнены нулями. … Если E1 имеет тип со знаком и неотрицательное значение, и E1 × 2E2 представимо в типе результата, то есть полученное значение; в противном случае поведение не определено.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]