如何在小端机器上 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”来暗示):
首先将输入双关到一个 char* 指针,就像您所做的那样:char* bytePtr = (char*)ptr
。假设小端本机字节顺序,*bytePtr
是整数 *ptr
.
的最低有效字节
指向 num 的最高有效字节的指针:char* dest = ((char*)&num) + 3
.
将 *bytePtr
分配给 *dest
。一个字节就完成了。
递增 bytePtr
递减 dest
.
对剩余的字节再重复步骤 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之外的字节顺序也是可以的,一个综合的解决方案也可以处理它们,但现在很少见了。)
/*
* 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”来暗示):
首先将输入双关到一个 char* 指针,就像您所做的那样:
的最低有效字节char* bytePtr = (char*)ptr
。假设小端本机字节顺序,*bytePtr
是整数*ptr
.指向 num 的最高有效字节的指针:
char* dest = ((char*)&num) + 3
.将
*bytePtr
分配给*dest
。一个字节就完成了。递增
bytePtr
递减dest
.对剩余的字节再重复步骤 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之外的字节顺序也是可以的,一个综合的解决方案也可以处理它们,但现在很少见了。)