这是一个双重问题。是否将某些数据类型转换为与算术右移相同的更大数据类型?
我一直在阅读关于编译器如何处理代码的错综复杂的问题,并且我有这种困惑。这两个过程似乎都遵循相同的符号整数符号扩展逻辑。那么转换是否仅仅作为算术右移来实现呢?
其中一个例子规定的函数,如
Int Fun1(unsigned word) { Return (int) ((word << 24) >> 24); }
传递的参数为0×87654321。 由于这将在转换为二进制文件时进行签名,因此转换将如何进行?我的逻辑是,左移应提取最后8位,将MSB保留为0,然后我们在右移时扩展。这个逻辑是否正确?
编辑:我知道downvote可能是由于未指定的信息。假设一个32位的大端机器,其中有符号整数的二进制补码。
你在问关于补码? – tijko
'word'被声明为'unsigned',所以应该编译为逻辑而不是算术移位。转换后执行有符号整数转换。 – Neapolitan
如果'int'是32位,那么'0x87654321'的类型是'unsigned int' –