转换为uint64时,int32或32位指针的意外符号扩展
我使用Visual Studio 2010(cl.exe / W4)将此代码编译为C文件:
int main( int argc,char *argv[] ) { unsigned __int64 a = 0x00000000FFFFFFFF; void *orig = (void *)0xFFFFFFFF; unsigned __int64 b = (unsigned __int64)orig; if( a != b ) printf( " problemta: %016I64Xtb: %016I64Xn",a,b ); return; } 没有警告,结果是:
我想int orig =(int)0xFFFFFFFF会引起争议,因为我没有指定一个整数的指针.但结果是一样的. 有人可以向我解释在C标准中它覆盖了orig是从0xFFFFFFFF扩展到0xFFFFFFFFFFFFFFFF的符号吗? 我原以为(unsigned __int64)orig会变成0x00000000FFFFFFFF.似乎转换首先是签名的__int64类型,然后它变为无符号? 编辑:这个问题已被回答,指针是符号扩展,这就是为什么我在gcc和msvc中看到这种行为.但是我不明白为什么当我执行类似(unsigned __int64)(int)0xF0000000时它的符号扩展到0xFFFFFFFFF0000000但是(unsigned __int64)0xF0000000并没有反而显示我想要的是0x00000000F0000000. 编辑:上述编辑的答案. (unsigned __int64)(int)0xF0000000符号扩展的原因是因为,如用户R所述:
并且在(无符号__int64)0xF0000000 0xF0000000作为无符号整数类型开始,因为它不能适合整数类型.接下来,已经无符号的类型转换为unsigned __int64. 因此,对我来说这是一个函数,它返回一个32位或64位指针作为无符号__int64进行比较我必须首先将32位应用程序中的32位指针转换为无符号类型,然后再将其提升为unsigned __int64.结果代码看起来像这样(但是,你知道,更好): unsigned __int64 functionidontcontrol( char * ); unsigned __int64 x; void *y = thisisa32bitaddress; x = functionidontcontrol(str); if( x != (uintptr_t)y ) 再次编辑: > 1当具有整数类型的值转换为另一个整数时
将指针转换为/从整数转换是实现定义的.
Here是gcc如何做到的,即如果整数类型大于指针类型,则符号会扩展(无论整数是有符号还是无符号,都会发生这种情况,因为这就是gcc决定实现它的方式). 据推测,msvc表现相似.编辑,我在MSDN上找到的最接近的东西是this/this,这表明将32位指针转换为64位也符号扩展. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – 与Windows兼容的文件系统的文件时间分辨
- windows-server-2008 – DC的只读配置是否仅适用
- windows安装scrapy
- MSDN Windows XP Professional x64 Edition with
- NonSerialized 字段如果在dll 中读到数据写入Mon
- 我可以在Windows Server 2003上运行.NET 4.0 Web
- 如何在Qt中获取系统默认字体设置?
- Microsoft SQL Server 2008 – 日期
- windows – 将“Everyone”组添加到目录及其所有
- .net – AssemblyInfo属性如何映射到Win32 VERSI