将移位的无符号位添加到 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);
我正在尝试执行以下操作
#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);