将移位的无符号位添加到无符号长整型(64位)

问题描述 投票:0回答:3

我正在尝试执行以下操作

#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调试器上,代码只是跳过了添加操作的行。

c bitmap unsigned-integer
3个回答
1
投票

printf函数对于不同的数据类型具有不同的格式。您正在使用类型为'unsigned long long'的变量,但在printf中,您使用的是“%u”,它仅打印“ unsigned int”类型的对象。通过给它错误的“数据类型”说明符,您将导致未定义的行为。您可以参考维基百科:https://en.wikipedia.org/wiki/C_data_types

对于正确的输出:

printf("test value %llu", test);

0
投票

实际上是加值,您只是没有意识到,因为要用%u打印出来。这会将值转换为unsigned int,这意味着它仅为100。如果您将%lluunsigned long long打印,则它将正确打印。


0
投票

进一步了解Aplet123的答案-参见this answer

附带说明-您链接的在线调试器上的编译器会输出警告,突出显示此内容。始终确保密切注意编译器发出的任何警告/错误:)

© www.soinside.com 2019 - 2024. All rights reserved.