__int64的奇怪列表输出

Weird list output of __int64

本文关键字:列表 输出 int64      更新时间:2023-10-16

我的__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 位;空出的位被0填充. ...如果 E1 有符号类型且非负值,且 E1 × 2E2在结果类型中是可表示的,则该值为结果值;否则,行为是未定义的。