我试图从int中将字节转换为所有小端系统中的便携方式中的一系列字符。c中的移位字符
我有以下代码:
#include <stdio.h>
int
main()
{
int i = 0xabcdef12;
printf("i: %x\n", i);
char a, b, c, d;
a = (i >> 000) & 0xFF;
b = (i >> 010) & 0xFF;
c = (i >> 020) & 0xFF;
d = (i >> 030) & 0xFF;
printf("a b c d: %x %x %x %x\n", a , b, c, d);
if(a == 0x12)
printf("a is 0x12\n");
if(b == 0xef)
printf("b is 0xef\n");
if(c == 0xcd)
printf("c is 0xcd\n");
if(d == 0xab)
printf("d is 0xab\n");
if(a == 0xffffff12)
printf("a is 0x12\n");
if(b == 0xffffffef)
printf("b is 0xffffffef\n");
if(c == 0xffffffcd)
printf("c is 0xffffffcd\n");
if(d == 0xffffffab)
printf("d is 0xffffffab\n");
return 0;
}
这段代码使用-Wall编译时没有任何警告。
当运行此给出:
i: abcdef12
a b c d: 12 ffffffef ffffffcd ffffffab
a is 0x12
b is 0xffffffef
c is 0xffffffcd
d is 0xffffffab
这里有一些GCC打印:
Breakpoint 1, main() at test.c:14
14 if(a == 0x12)
(gdb) p/x a
$1 = 0x12
(gdb) p/x b
$2 = 0xef
(gdb) p/x c
$3 = 0xcd
(gdb) p/x d
$4 = 0xab
我敢肯定,我做错了什么。如果你可以回答以下几个问题,这将真正帮助我理解发生了什么:
- char怎么能有大于0xff的值?
- 什么不是
& 0xff
位掩码工作? - 为什么gdb报告正确的值?
如果任何人有一个可靠的(系统独立,但endianess并不重要)的方式从int到char [],这将是很好的。
你有意使用八进制文字吗? – Mysticial 2012-07-19 00:32:17
“如果有人从int到char []有一个可靠的(系统独立的,但是endianess并不重要),那将会很棒。” 关于工会呢? – 2012-07-19 00:35:22
@ DennisMeng - 工会是键入指针的好方法。它们依赖于系统,但是...如果在四个无符号字符值的数组与一个整数之间进行联合,则可以非常方便地读出整数的字节;但是你的代码至少要依赖于计算机的字节顺序,也可能依赖于其他实现细节(你可能需要使用'#pragma'来控制填充)。我建议移植和屏蔽可移植代码,并且为应该尽可能快的代码添加联合加测试用例。 – steveha 2012-07-19 02:06:55