如何在小端机器上 return 351351 int?

How to return 351351 int, on little endian machine?

/*
 * Change the value pointed to by ptr byte-by-byte so that when returned as an
 * integer the value is 351351.
 *
 * Hints: Recall that an int is 4 bytes and how little-endian works for
 * multibyte memory storage. We suggest starting by converting 351351 into
 * binary/hexadecimal.
 *
 * ALLOWED:
 *   Pointer operators: *, &
 *   Binary integer operators: -, +, *
 *   Shorthand operators based on the above: +=, *=, ++, --, etc.
 *   Unary integer operators: !
 *
 * DISALLOWED:
 *   Pointer operators: [] (Array Indexing Operator)
 *   Binary integer operators: &, &&, |, ||, <, >, <<, >>, ==, !=, ^, /, %
 *   Unary integer operators: ~, -
 */

我需要按照上面的要求写一个函数。我不能使用循环、数组索引和其他东西。我了解字节序概念。所以我有整数 351351。在十六进制中它是 0x 00 05 5C 77。所以对于小端机器,它会被存储为77 5C 05 00,对吗?

int endianExperiment(int * ptr) {
  char * bytePtr;
  // Your code here
  // 0x 00 05 5C 77
  int num = 0;
  bytePtr = (char * ) ptr;

  return num;
}

到目前为止,这是我的功能。我得到了 char 中指针参数的地址(所以只有 2 个字节),然后将它存储在 bytePtr 中。但是我被困住了。我尝试了几种选择,但没有任何效果。请帮忙。

此外,对于小尾数法,数字以最低有效位存储在数组的最低索引处。但是要访问它(数字的地址),它仍然是最低索引吗?还是包含第一个字节的索引?我需要将指针指向哪里?

“禁止”列表做了很多限制。例如,通常的方法是对字节进行位掩码 (&) 和位移位 (<<, >>) 到相反的字节序位置,但这些操作是不允许的。余数 (%) 也是不允许的,否则我们可以使用它来模拟位掩码。那还剩下什么?听起来允许的方法如下(并通过要求更改值“byte-by-byte”来暗示):

  1. 首先将输入双关到一个 char* 指针,就像您所做的那样:char* bytePtr = (char*)ptr。假设小端本机字节顺序,*bytePtr 是整数 *ptr.

    的最低有效字节
  2. 指向 num 的最高有效字节的指针:char* dest = ((char*)&num) + 3.

  3. *bytePtr 分配给 *dest。一个字节就完成了。

  4. 递增 bytePtr 递减 dest.

  5. 对剩余的字节再重复步骤 3 和 4 三次。但是不要使用循环来做到这一点,因为 < 是不允许的,只需写出展开的重复即可。

最后,num 包含反转字节序的整数。


编辑:我可能误解了意图。感谢 busybee 指出这一点。 Re-reading,问题陈述是“更改 ptr byte-by-byte 指向的值,以便在作为整数返回时值为 351351。”

听起来我们应该将特定的int值351351写入*ptr。而且,我们应该这样做byte-by-byte---如果我们能做到*ptr = 351351.

就太容易了

351351的十六进制形式是罗马所说的0x00055c77

  • 假设机器是little endian,写入字节0x77、0x5c、0x05、0x00,从最低地址0x77开始:*bytePtr = 0x77*(bytePtr + 1) = 0x5c,依此类推上。

  • 但是,如果机器是big endian,字节需要倒序,这样*ptr == 351351当被解释为一个int值时:*bytePtr = 0x00*(bytePtr + 1) = 0x05,依此类推。

编写可移植的代码以在小端和大端机器上工作是个好主意。 There are multiple methods 检测机器的字节序,包括一些在 C 中使用允许的操作的字节序。所以我们可以检测小字节序和大字节序,然后继续以适当的顺序如上所述写入字节。 (除了little和big之外的字节顺序也是可以的,一个综合的解决方案也可以处理它们,但现在很少见了。)