符合标准的编译器是否可以破坏uint32_t – > int16_t – >
最近,我们在一些旧代码中发现了奇怪的行为.这段代码已经工作了很长时间,但在某些平台(XBox 360,PowerPC)上打破了编译器优化最大化.通常,我怀疑未定义的行为.
代码看起来大致如下: #include <stdint.h> uint32_t sign_extend16(uint32_t val) { return (int32_t)(int16_t)val; } 它是模拟器的一部分,因此有问题的操作不应该太奇怪. 0000000000000000 <sign_extend16>: 0: 0f bf c7 movswl %di,%eax 3: c3 retq 但是,根据我对标准的理解,如果不能用带符号类型表示无符号的值,则无法定义将无符号转换为有符号. 那么编译器是否可以假设无符号值必须在[0,32767]的范围内,因为任何其他值都是未定义的?在这种情况下,转换为int16_t而另一个转换为int32_t将不执行任何操作.在这种情况下,编译器将代码转换为简单的移动是否合法?
两个整数类型之间的转换永远不是未定义的行为.
但是一些整数转换是实现定义的. 在整数转换上,C表示:
这个案例中的gcc在这里记录了什么: http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- geopandas安装问题记录:ImportError,DLL load failed
- windows-phone-8 – Windows Phone 8检查位置是否打开/关闭
- 为什么以及什么时候需要mqtt经纪人用于IOT / M2M应用程序
- Microsoft .NET Framework多个远程代码执行漏洞(MS09-061)
- listbox – 如何将不同的背景颜色添加到备用行以列出框项目
- powershell – 如何在交换混合环境中备份/导出office 365电
- xaml – 使用ScrollViewer内部捕获操作类事件(Windows Phon
- wpf – Listview XAML中的替代背景颜色
- Wix绑定子串或拆分
- windows-xp – 脚本 – 如何断开远程桌面会话?