1

__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
4

1 回答 1

1

如果col不是 64 位类型的数组,则您的班次会导致未定义的行为。换档前施法:

(__int64)col[7] << 56

如果移位会导致符号更改,这也是未定义的行为,因此在使用带符号类型时要小心(就像你一样)。

从 C11 6.5.7 位移位运算符(强调我的):

对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

的结果E1 << E2E1左移的E2位位置;空出的位用零填充。...如果E1有一个有符号类型和非负值,并且E1× 2 E2在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。

于 2013-05-28T17:19:45.810 回答