2016-02-25 198 views
0

在c程序中。我正在尝试在uint64_t变量上使用左移运算符。无符号long long型按位移

E.g.

// with shift of 24 bits 
    uint64_t x = 0; 
    x = (((uint64_t)76) << (24)); 
    Output is: x = 1275068416 
    --------------------------------------------- 
    // with shift of 32 bits 
    uint64_t x = 0; 
    x = (((uint64_t)76) << (32)); 
    Output is: x = 0 

如果我执行左移,直到24位,然后它工作得很好,但在32位则输出0而我认为是作为uint64_t中即无符号长长是64位的大小。所以,它应该不会工作,直到64位的转变?

+2

你用什么构造来检查'x'的值? – ach

+0

我只是使用printf printf(“....%d \ n”,x)打印出x的值; – TechJ

+2

QED,那么..'%d'正在为'int'工作。使用“'%llu'” –

回答

2

您正在使用错误的格式说明符来打印输出。格式说明符%d需要int,这在系统上显然是32位的。因此传递一个64位值(以及一个未签名的值)会导致未定义的行为。

您应该使用PRIu64宏为无符号的64位值获取正确的格式说明符。

printf("%"PRIu64"\n", x); 
+0

'%lu'仅为'unsigned long'保留。在通常为32位的Windows机器上。 – ach

+0

@AndreyChernyakhovskiy谢谢。编辑应用。 – dbush