у меня проблема с __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
если col
это не массив 64-битных типов, ваши изменения вызывают неопределенное поведение. В ролях перед сдвигом:
(__int64)col[7] << 56
Это также неопределенное поведение, если сдвиг вызовет изменение знака, поэтому будьте осторожны при использовании подписанных типов (таких как вы).
От C11 6.5.7 Битовые операторы сдвига (выделение мое):
Целочисленные продвижения выполняются на каждом из операндов. Тип результата — тип повышенного левого операнда. Если значение правого операнда отрицательно или больше или равно ширине повышенного левого операнда, поведение не определено.
Результат
E1 << E2
являетсяE1
сдвинуты влевоE2
битовые позиции; освобожденные биты заполнены нулями. … ЕслиE1
имеет тип со знаком и неотрицательное значение, иE1
× 2E2 представимо в типе результата, то есть полученное значение; в противном случае поведение не определено.
Других решений пока нет …