[英]In C, what happens if we left shift the bits out of range and again right shift the values in the same operation
[英]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.