您不能将char x
作为指针使用!!! 因为char
只有一个字节长。
您至少需要:
unsigned long int swapPtr(unsigned long int x) {
或者更好的方法是使用指针的类型。
void* swapPtr(void* x) {
当你开始对指针进行位移操作时,很可能编译器会报错;这种情况下,最好将参数显式转换为无符号64位整数:
#include <stdint.h>
uint64_t x;
请注意,您必须使用变量地址进行调用,因此请使用以下方式进行调用:
result = swapLong(&loc);
不是
*loc
(它查看
loc
指向的位置 - 值而不是地址)。
完整的程序:
#include <stdio.h>
#include <stdint.h>
uint64_t swapLong(void *X) {
uint64_t x = (uint64_t) X;
x = (x & 0x00000000FFFFFFFF) << 32 | (x & 0xFFFFFFFF00000000) >> 32;
x = (x & 0x0000FFFF0000FFFF) << 16 | (x & 0xFFFF0000FFFF0000) >> 16;
x = (x & 0x00FF00FF00FF00FF) << 8 | (x & 0xFF00FF00FF00FF00) >> 8;
return x;
}
int main(void) {
char a;
printf("the address of a is 0x%016llx\n", (uint64_t)(&a));
printf("swapping all the bytes gives 0x%016llx\n",(uint64_t)swapLong(&a));
}
输出:
the address of a is 0x00007fff6b133b1b
swapping all the bytes gives 0x1b3b136bff7f0000
编辑,你可以使用类似于:
#include <inttypes.h>
printf("the address of a is 0x%016" PRIx64 "\n", (uint64_t)(&a));
宏 PRIx64
会转换成“以十六进制形式打印 64 位数字所需的格式字符串”。这比上面的方法更加简洁。
char
不是正确的数据类型。它通常只占用一个8位字节。如果您使用的平台支持64位的char
,请说明。 - Mat