代码看起来大致如下:
#include <stdint.h> uint32_t sign_extend16(uint32_t val) { return (int32_t)(int16_t)val; }
它是模拟器的一部分,因此有问题的操作不应该太奇怪.
通常,我希望这只考虑较低的16位并将其扩展为32位.
显然,这是它多年来的行为.在x86_64上,GCC给出了这个结果:
0000000000000000 <sign_extend16>: 0: 0f bf c7 movswl %di,%eax 3: c3 retq
但是,根据我对标准的理解,如果不能用带符号类型表示无符号的值,则无法定义将无符号转换为有符号.
那么编译器是否可以假设无符号值必须在[0,32767]的范围内,因为任何其他值都是未定义的?在这种情况下,转换为int16_t而另一个转换为int32_t将不执行任何操作.在这种情况下,编译器将代码转换为简单的移动是否合法?
但是一些整数转换是实现定义的.
在整数转换上,C表示:
(C99,6.3.1.3p3) “Otherwise,the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.”
这个案例中的gcc在这里记录了什么:
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
“For conversion to a type of width N,the value is reduced modulo 2^N to be within range of the type; no signal is raised”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。