我已经看到这是双向的。无论哪种方式都有优点或缺点吗?
short x = 0x9D6C;
char cx[2];
First way:
cx[0] = x &0xff;
cx[1] = (x >> 8) & 0xff;
vs。 第二种方式:
memcpy(cx, (char*)&x, 2);
有什么想法吗?
答案 0 :(得分:0)
以任何一种方式进行操作是否有优点或缺点?
是的,因为功能可能不同,所以代码应该执行功能上需要的工作。
cx[0] = x &0xff; cx[1] = (x >> 8) & 0xff;
将最低有效值字节移至cx[0]
中,并将下一个最高有效字节移至cx[1]
中。
memcpy(cx, (char*)&x, 2);
将x
的最低寻址字节移至cx[0]
,并将x
的下一个寻址字节移至cx[1]
。
当具有特定的endian和通用的short
大小时,这两种方法具有相同的功能。
什么是最好的取决于较大的代码,而不取决于狭窄的代码段。
就性能而言,这属于micro optimization。一个好的编译器可以分析memcpy()
并发出有效的代码而无需调用函数。最好将程序员的时间用于处理更高级别的代码以提高性能。
memcpy(cx, (char*)&x, 2);
中不需要强制转换
请注意,short
并不总是布置在特定的 endian 中。 short
不是2 char
并不常见。
E1 >> 8
导致“如果E1具有带符号的类型和负值,则结果值是实现定义的”。
更好的代码将使用 unsigned 类型,并避免细微的问题。
请注意,标题中没有short
到char
的投射。