2015-11-02 96 views
-3

我试图对64位变量进行大于32的移位操作。 有人可以告诉我的代码搞砸了吗?对于64位变量,按位移> = 32操作C

处理器architechture是AMD64和开发环境Visual Studio的社区2015年和DEVC++

我的代码如下所示:

#include <stdio.h> 
#include <stdint.h> 
int main(int argc, char *argv[]) 
{ 
    uint64_t x = ~0; 
    printf("x is %8x \n", x); 
    x = ~((uint64_t)(1) << 31); 
    printf("x is %8x \n", x); 
    x = ~((uint64_t)(1) << 32); 
    printf("x is %8x \n", x); 
    return 1; 
} 

输出是:

x is ffffffff 
x is 7fffffff 
x is ffffffff 

我一直在思考在这整个上午现在.. 我真的是一个初学者与C上比嵌入式8位体系结构:)

-Codester

+3

%×32bit的打印变量 – Hcorg

+0

使用调试器,而不是printf的 – BeyelerStudios

+0

也许'%lx'为64位。或者把'printf'转换成'double'。 – i486

回答

2

增加额外llX到printf格式解决我的问题:

#include <stdio.h> 
#include <stdint.h> 
int main(int argc, char *argv[]) 
{ 
    uint64_t x = ~0; 
    printf("x is %8llX \n", x); 
    x = ~((uint64_t)(1) << 31); 
    printf("x is %8llX \n", x); 
    x = ~((uint64_t)(1) << 32); 
    printf("x is %8llX \n", x); 
    return 1; 
} 

所以很多时候回答太简单了:P

4
  • uint64_t x = ~0;

    此代码如果int是32位将不起作用。如果您想以便携方式将uint64_t设置为“全部”,则需要执行uint64_t x = ~(uint64_t)0;

  • %8x

    这不是uint64_t正确的格式说明。你应该使用PRIx64inttypes.h。例如:

    #include <inttypes.h> 
    
    printf("x is %8" PRIx64 "\n", x);