你在提供的代码中有一个小错误,导致大端和小端转换不正确。特别是在右移位时,有些掩码没有考虑到64位无符号整数的完整性。以下是修正后的代码:
#include <stdint.h>
#include <stdio.h>
// 大端转小端
uint64_t swap_uint64(uint64_t value) {
return ((value & 0x00000000000000FFULL) << 56) |
((value & 0x000000000000FF00ULL) << 40) |
((value & 0x00000000FF000000ULL) << 24) |
((value & 0x00FF000000000000ULL) << 8) |
((value & 0x0000FF00ULL) >> 8) |
((value & 0x00FF0000ULL) >> 24) |
((value & 0xFF00000000ULL) >> 40) |
((value & 0xFF80000000ULL) >> 56); // 注意这里是去掉了多余的零
}
// 使用示例
int main() {
uint64_t original = 0x1122334455667788;
uint64_t swapped = swap_uint64(original);
// 打印结果
printf("Original: %016llX\n", original);
printf("Swapped: %016llX\n", swapped);
return 0;
}
修正要点:
掩码(Mask):确保每个掩码都正确并且与右移操作匹配。例如,在
((value & 0x0000FF00)
的时候应该添加ULL
后缀以确保它是无符号长整型。打印格式:使用
%016llX
来格式化输出,以确保输出为16位十六进制数,并用零填充。
测试程序
如果你运行这个修正后的程序,你将会得到正确的大端和小端之间的转换。原始值 1122334455667788
将被正确地转换并显示为其对应的小端表示形式。
内容由零声教学AI助手提供,问题来源于学员提问