簡體   English   中英

移位計數操作允許哪些值?

[英]what values are allowed for the shift count operation?

#include <stdio.h>

int main(void)
{
    unsigned int var=1;
    var = var<<32;
    printf("%u ",var);
} 

此代碼產生1作為其輸出。 如果我寫var = var<<31; 它產生2147483648

如果我輸入var = 12; 然后var = var<<32; 它產生12 我從一本舊書中讀到,ANSI C不允許一次操作將所有位移出一個值。

當我指示它執行var = var<<32;時,所有主要編譯器的行為是否都相同(將粘貼復制輸入復制到輸出),或者只是GCC確實將粘貼12從輸入復制到輸出var = var<<32; ???

C11 6.5.7按位移位運算符

如果右操作數的值為負或大於或等於提升的左操作數的寬度,則行為是不確定的。

這意味着如果在這種情況下移位32位或更多位,則沒有明確定義的行為。 任何事情都可能發生,包括崩潰和奇怪的結果。

我從一本舊書中讀到,ANSI C不允許一次操作將所有位移出一個值。

這是正確的,您必須執行幾個位運算,例如x<<=16; x<<=16; x<<=16; x<<=16; 避免未定義的行為。

GCC從字面上說您回答: left shift count >= width of type [-Wshift-count-overflow]

它還取決於您使用的體系結構。 您的問題已經在這里得到回答。

只是更深入一點:

通常,C語言被開發為“便攜式匯編程序”。 內置操作只是大多數CPU所實現的操作,它們的語義為可移植性提供了最低的標准。

幾乎每個CPU都提供左移和右移操作。 但是平台在細節(例如溢出和負數)方面有所不同,因此C標准保留了一些不確定的情況。

特別是,對於大於寄存器寬度的移位計數,許多CPU僅使用所需的位數,並截斷其余部分。 當計數為常數時,編譯器可能會記錄未定義的行為,並僅將操作作為垃圾丟棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM