C 如何打印所有8字节的8字节变量,以及如何应用`&&;`对它们进行位操作?

C 如何打印所有8字节的8字节变量,以及如何应用`&&;`对它们进行位操作?,c,bitwise-operators,C,Bitwise Operators,如何打印8字节变量的所有8字节,以及如何对其应用&&逐位运算符 int main(void) { uint64_t a = 0x2345678987654321; uint64_t b = 0x2345678987654321; uint64_t c = 0x11111111; b= 0x2345678987654321 && 0xFFFFFFFFFFFFFF00; printf("a is %llX b is %llX c is

如何打印8字节变量的所有8字节,以及如何对其应用
&&
逐位运算符

int main(void)
{
     uint64_t a = 0x2345678987654321;
     uint64_t b = 0x2345678987654321;
     uint64_t c = 0x11111111;
     b= 0x2345678987654321 && 0xFFFFFFFFFFFFFF00;
     printf("a is %llX b is %llX c is %llx" ,a, b, c);
     return EXIT_SUCCESS;
}

您需要向
%llX
格式说明符添加字段宽度和零填充标志:

printf("a is %016llX b is %016llX c is %016llx" ,a, b, c);
16
表示该字段应为16个字符宽(64位数字为16个十六进制数字),前导的
0
表示该字段应在左侧用零填充


另外,
&&
是逻辑AND运算符。按位AND运算符是
&
&
运算符是逻辑AND运算符。当两个操作数均为非零时,它会产生一个布尔值(真/假,在C中由
int
1
/
0
表示)。它还严格地首先计算左操作数,如果结果依赖于右操作数,则仅计算右操作数(即,如果左操作数不为零;这对应于相同逻辑运算符链)

您需要计算所有(整数)操作数的逐位
&
(and)运算符:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>  // format-strings for stdint.h types

int main(void)
{
    uint64_t a = 0x2345678987654321U;
    uint64_t b = 0x2345678987654321U;
    uint64_t c = 0x11111111U;
    b = b & 0xFFFFFFFFFFFFFF00U;
    printf("a is %016" PRIx64 " b is %016" PRIx64 " c is %016" PRIx64, a, b, c);
}
至少获取64位无符号类型的另一种方法是:

#define U64_CONST UINT64_C(0x123U)
此宏将生成一个
uint\u至少64\u t
(有关更多信息,请参阅)。和往常一样,启用警告可以让编译器帮助您查找不适合给定类型的常量

出于类似的原因,
stdint.h
类型的正确(请参见我为什么添加
016
的链接)和
scanf
格式说明符在中。每一个都是一个宏,带有一个字符串文字,其中包含适用于您的平台的正确格式说明符。使用字符串文字连接(两个相邻的字符串文字组合为单个字符串文字-注意,中间没有运算符)来组合格式字符串


注意:上述内容当然也适用于其他位大小的类型(可能更重要)。

您使用的格式字符串不正确。正确的做法是使用
inttypes.h
,这里
PRIx64
@Olaf-Nah,只需在一些头文件中添加
static\u-assert(sizeof(uint64-t)==sizeof(unsigned long-long),“bleh”)
。不需要把PRI-PRI喷到所有代码上。我是@Olaf的。是的,它们既丑陋又无聊;但有些事情甚至更重要。@Olaf,因为格式说明符是一件不重要的小事;您真正应该关心的是程序中每个整数文本的类型。保证每个整数文本的大小是绝对必要的。如果程序员试图编写可移植程序,因此在不同的系统之间让整数文本异想天开地改变大小,那么无疑会引入大量与类型相关的bug。所有这些错误都是非常微妙的,是由隐式提升和类似的错误引起的。因此,当你遇到编译器错误时,通常会有一个编译器选项,你可以设置为int、long和long-long的大小,整数文本的大小将随之出现。这就是如何以确定的方式确保可移植性。@paulr:谢谢您的编辑。我只是想让你知道我没有把你的答案录下来。@PaulR:嗯,你可能会抱怨,但这是一些初学者读的。你不同意他们应该先学习正确的、最标准的/便携的方法吗?一旦他们学会了,他们应该能够知道什么时候遵守规则,什么时候你可以“拉伸”规则。这很像开车:首先你必须严格遵守限速,然后你知道有时你可以开快10-20%。很少有代码示例是完美的(例如,你缺少
#在上面的代码中包含
)-回答特定问题所需的代码质量级别取决于判断。
ULL
将至少为64位,因此您可以通过这种方式指定64位常量,并将
(uint64_t)
转换为确定值。但是所有这些例子都应该使用
UINT64_C(val)
。还记得
是如何让生活变得简单的吗?哈!
&
是逻辑运算符,
&
是位运算符。现在有两个答案。如果有任何或全部回答了您的问题,请接受最合适的一个。你也可以选择你喜欢的答案。这是说“谢谢你抽出时间”的方式。
#define U64_CONST UINT64_C(0x123U)