我正在尝试执行以下操作
#include <stdio.h>
#include <stdint.h>
int main()
{
unsigned long long test = 100; //64 bits
test = test + (1UL << 33); //assuming 64 bits
printf("test value %u", test);
return 0;
}
测试打印100。我期望它能将移位后的位添加到它。
我可以看到它的大小有问题,好像我加了1UL << 14测试等于16484。
我正在这里测试:https://onlinegdb.com/r1njSlGjU
我该如何添加呢?我注意到在我的gdb调试器上,代码只是跳过了添加操作的行。
printf函数对于不同的数据类型具有不同的格式。您正在使用类型为'unsigned long long'的变量,但在printf中,您使用的是“%u”,它仅打印“ unsigned int”类型的对象。通过给它错误的“数据类型”说明符,您将导致未定义的行为。您可以参考维基百科:https://en.wikipedia.org/wiki/C_data_types。
对于正确的输出:
printf("test value %llu", test);
实际上是是加值,您只是没有意识到,因为要用%u
打印出来。这会将值转换为unsigned int
,这意味着它仅为100。如果您将%llu
的unsigned long long
打印,则它将正确打印。
进一步了解Aplet123的答案-参见this answer。
附带说明-您链接的在线调试器上的编译器会输出警告,突出显示此内容。始终确保密切注意编译器发出的任何警告/错误:)