2017-03-28 70 views
2
#include <stdio.h> 
#include <stdint.h> 

int main(){ 
    uint64_t a = 1 << 63; 
    /* do some thing */ 
    return 0; 
} 

$ gcc -Wall -Wextra -std=c99 test.c -o test 
warning: left shift count >= width of type [-Wshift-count-overflow] 

問:uint64_t應具有64個比特的寬度,所以左移位運算溢出?如何在C使用uint64_t中

+0

1是'int'文字。使用'1ULL << 63'代替 –

+0

@LưuVĩnhPhúcÇ指定'1'類型的_integer constant_'int'。 C中唯一指定的_literals_是_string literals_和_compound literals_。 '1'既不是那兩個文字。 – chux

+0

「爲什麼左移操作溢出?」 - >哪一個首先發生:'1 << 63'或者它賦值給'uint64_t a'?由於'1 << 63'發生第一,它被分配給的類型是無關的'1 << 63'評估。 – chux

回答

6

1是一個int它可能只有32位在您的平臺上,或者它可能是64位但簽名。

使用(uint64_t)1 << 63到第一投1到64位的無符號整數。 (或者((uint64_t)1) << 63,如果你喜歡)

+0

沒有必要投,'1ULL'看起來更好。和'(uint64_t中)1 << 64',因爲你比移值的位長 –

+0

@LưuVĩnhPhúc固定,64應該已經63多個調用未定義的行爲。 – immibis