对于C中的64位变量,按位移位> = 32运算

时间:2015-11-02 10:41:51

标签: c

我正在尝试对64位变量进行长于32的移位操作。 有人能说出我的代码搞砸了什么。

处理器架构是AMD64,开发环境是Visual Studio Community 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

2 个答案:

答案 0 :(得分:4)

  • uint64_t x = ~0;

    如果int为32位,则此代码无法正常工作。如果你想将uint64_t设置为&#34;所有的&#34;以便携方式,您需要uint64_t x = ~(uint64_t)0;

  • %8x

    这不是uint64_t的正确格式说明符。您应该使用PRIx64中的inttypes.h。例如:

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

答案 1 :(得分:2)

为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; } 解决了我的问题:

dynamic var

这么多次回答太简单了:P