- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
UINT One = 1;
LONG mylong = LONG(-1) * One;
LONGLONG mylonglong1 = LONG(-1) * One;
LONGLONG mylonglong2 = LONG(LONG(-1) * One);
mylong
、mylonglong1
和 mylonglong2
中存储的值是多少?
mylong = 0xffffffff (ok)
mylonglong1 = 0x00000000ffffffff (why?)
mylonglong2 = 0xffffffffffffffff (ok)
mylonglong1
的结果让我很惊讶,更惊讶的是竟然没有编译警告。
为什么将 LONG 分配给 LONGLONG 会导致左填充为零?
项目中真正发生的是使用函数CFile::Seek()的问题
virtual LONG Seek( LONG lOff, UINT nFrom );
定义在这里:https://msdn.microsoft.com/en-us/library/aa270542(v=vs.60).aspx迁移到
virtual ULONGLONG Seek( LONGLONG lOff, UINT nFrom);
在这里定义https://msdn.microsoft.com/library/b2eb5757-d499-4e67-b044-dd7d1abaa0f8.aspx#cfile__seek
迁移后它不再有效,因为 lOff
的参数转换没有给出预期的结果。
最佳答案
在表达式 (-1) * (UINT)1
中,第一个操作数根据 operand conversion rules 转换为 UINT
:
Otherwise, if the unsigned operand's conversion rank is greater or equal to the conversion rank of the signed operand, the signed operand is converted to the unsigned operand's type.
因此,我们有一个结果类型为 UINT
的无符号乘法。从 UINT
到 LONGLONG
的转换很简单,因为 LONGLONG
可以表示 UINT
可以表示的每个数字,在这种情况下0xffffffff
。这就是您最终得到 0x00000000ffffffff
的方式。
现在,当你执行 LONG(LONG(-1) * (UINT)1)
时,上面的规则仍然适用,尽管你最终将无符号 0xffffffff
转换为-1
,然后符号扩展为 LONGLONG
。
P.S:我假设 Win32/Win64,其中 UINT 和 LONG 是 32 位,LONGLONG 是 64 位。
关于c++ - 从 int 到 longlong 的危险转换 : No warning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693609/
我是一名优秀的程序员,十分优秀!