2016-12-03 49 views
-3

这是一个双重问题。是否将某些数据类型转换为与算术右移相同的更大数据类型?

  1. 我一直在阅读关于编译器如何处理代码的错综复杂的问题,并且我有这种困惑。这两个过程似乎都遵循相同的符号整数符号扩展逻辑。那么转换是否仅仅作为算术右移来实现呢?

  2. 其中一个例子规定的函数,如

    Int Fun1(unsigned word) { 
         Return (int) ((word << 24) >> 24); 
    } 
    

    传递的参数为0×87654321。 由于这将在转换为二进制文件时进行签名,因此转换将如何进行?我的逻辑是,左移应提取最后8位,将MSB保留为0,然后我们在右移时扩展。这个逻辑是否正确?

编辑:我知道downvote可能是由于未指定的信息。假设一个32位的大端机器,其中有符号整数的二进制补码。

+0

你在问关于补码? – tijko

+0

'word'被声明为'unsigned',所以应该编译为逻辑而不是算术移位。转换后执行有符号整数转换。 – Neapolitan

+0

如果'int'是32位,那么'0x87654321'的类型是'unsigned int' –

回答

1

鉴于OP的“假设一个32位...机器带有有符号整数的二进制补码”。 (这意味着32位unsigned)时转换成二进制

0x87654321是一个十六进制常数

0×87654321由于这将被签署。它有unsigned的类型。它没有签名。


// Int Fun1(unsigned word) { 
int Fun1(unsigned word) { 
     Return (int) ((word << 24) >> 24); 
} 

Fun1(0x87654321)导致unsigned word具有0x87654321值。没有发生类型和价值转换。

word << 24的值为0x21000000,仍然是unsigned的类型。

(word << 24) >> 24的值为0x21,仍然是unsigned的类型。

铸造到int保留相同的值0x21,但现在键入int


所以在转换简单地实现算术右移?

令人怀疑,因为没有签名转移编码。 C没有指定编译器如何实现C代码。可能发生了一对轮班,或者一个面具或一个乘法/划分。

相关问题