将移位的无符号位添加到 unsigned long long(64 位)

Add shifted unsigned bit to unsigned long long (64 bit)

我正在尝试执行以下操作

#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;

}

test 打印 100。我期待它向它添加移位的位。

我可以看到它的大小有一些问题,就好像我,例如添加 1UL << 14 test 将等于 16484.

我正在这里测试:https://onlinegdb.com/r1njSlGjU

我该如何添加它?我注意到在我的 gdb 调试器上,代码只是跳过了添加的行。

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

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

对于正确的输出:

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