GCC:当shift大于32时,unsigned long long int上的左移运算符不起作用?

lf3rwulv  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(163)

考虑这个简单的例子:

unsigned long long int my_int=0b10100110;
printf("%.64B\n",my_int<<40);

为什么输出为零?使用unsigned long long int(sizeof = 8),64位计算机,操作系统:Fedora 37、gcc(GCC)12.2.1 20221121(Red Hat 12.2.1-4)以及使用或不使用m64标志的编译。

nom7f22z

nom7f22z1#

对于初学者,整型常量的格式如下

0b10100110

不是标准的。
二进制整型常量在C++中有效。
此外,函数printf不支持转换说明符B
在任何情况下,要输出unsigned long long int类型的对象,都需要在转换说明符之前使用长度修饰符ll
相反,您可以使用十六进制整数常量,例如

unsigned long long int my_int = 0xA6;

并输出为

printf("%#.8llx\n",my_int<<40);

在这种情况下,输出如下所示

0xa60000000000

或者正如**@chux - Reinstate Monica**在注解中正确指出的那样,您可以使用以下调用

printf("%#0.8llx\n",my_int<<40);

以在相应的自变量等于0时输出前缀0x

相关问题