gpt4 book ai didi

c++ - 从 int 到 longlong 的危险转换 : No warning?

转载 作者:行者123 更新时间:2023-11-28 01:46:55 25 4
gpt4 key购买 nike

UINT One = 1;
LONG mylong = LONG(-1) * One;
LONGLONG mylonglong1 = LONG(-1) * One;
LONGLONG mylonglong2 = LONG(LONG(-1) * One);

mylongmylonglong1mylonglong2 中存储的值是多少?

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 的无符号乘法。从 UINTLONGLONG 的转换很简单,因为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com