我正在尝试对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
答案 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