在特定地址存储答案
Storing answer at a specific address
我正在尝试用语句 "Two numbers, x and are stored in memory locations [=17=]79 and 79 respectively. Write a C code that reads both number using two pointers. Compare the numbers, if they are the same, add them. If they are different subtract them. Write the result of the operation at the address 79"
来解决问题
现在我想到的解决方案是这个
Int *foo = 0079;
Int *foo1 = 0179;
Int*result = 0279;
If (*foo == *foo1)
{
*result = *foo+*foo1;
}else if(*foo>*foo1)
{
*result = *foo-*foo1;
}else
{
*result = *foo1-*foo2;
}
但我对此有疑问,我应该使用 0x0079 而不是 0079 还是应该使用 (int *)0800000079 作为我的一位朋友建议的
你朋友的建议很奇怪。我不知道他或她为什么要求婚 (int *)0800000079
,不过你可能需要演员表。
回归理智,0x0079
vs 0079
的问题不是代码问题,而是问题需求解读的问题:
- 如果
[=13=]79
表示十六进制,那么这是C++中的0x0079
(不是 0079
,一个无效的八进制文字);
- 如果你不知道
[=13=]79
是什么意思,你得向作者询问更多细节。
对于它的价值,在几种汇编语言(6502、摩托罗拉)、Pascal、Delphi、BASIC (Commodore)、Game Maker Language、Godot 和 Forth 的某些版本中,[=13=]79
将表示一个十六进制值。
您可能对此代码有疑问,但您的编译器不会 - 它会完全拒绝它。
以零数字开头的文字整数常量被解释为八进制(基数 8),因此可能只有 0 到 7 的数字。因此,例如 0079 是无效的。
因此,这些地址旨在为十进制(例如 79)或十六进制(基数 16 - 例如 0x79)。地址通常以十六进制表示,因此假设 0x0079 是预期的。
我认为建议 0800000079 是一个拼写错误,应该是 0x00000079?在这种情况下,0x79 与 0x00000079 的值相同 - int*
的类型转换是有效的,但不是绝对必要的,因为否则会发生隐式转换。
奇数地址对于 int
数据类型来说似乎不太可能,因为它通常是字对齐的 - 一些架构需要它,其他架构会生成额外的代码来访问未对齐的地址。如果奇数地址是正确的,它可能暗示一个 8 位目标,而 0x00000079 暗示一个 32 位地址总线——这似乎是一个不太可能的组合。
从本质上讲,这个问题似乎难以置信且定义不清;但是从表面上看,您的解决方案不必要地复杂;我会建议:
#define OP1 (*((int*)0x0079))
#define OP2 (*((int*)0x0179))
#define RESULT (*((int*)0x0279))
if( OP1 == OP2 )
{
RESULT = OP1 + OP2 ;
}
else
{
RESULT = OP1 - OP2 ;
}
此处宏的使用在一定程度上简化了语法。你的建议对 OP1 > OP2 进行了不必要的测试,最后一个 else 子句做同样的事情。只有两个互斥条件——等于或不等于,所以你只需要显式测试一个条件,因为其他一切都必须满足。在 C++ 中(你的标签暗示了一些语言的优柔寡断)你可以通过使用引用类型来避免宏(几乎总是一个好主意):
int& op1 = *((int*)0x0079) ;
int& op2 = *((int*)0x0179) ;
int& result = *((int*)0x0279) ;
if( op1 == op2 )
{
result = op1 + op2 ;
}
else
{
result = op1 - op2 ;
}
我正在尝试用语句 "Two numbers, x and are stored in memory locations [=17=]79 and 79 respectively. Write a C code that reads both number using two pointers. Compare the numbers, if they are the same, add them. If they are different subtract them. Write the result of the operation at the address 79"
来解决问题现在我想到的解决方案是这个
Int *foo = 0079;
Int *foo1 = 0179;
Int*result = 0279;
If (*foo == *foo1)
{
*result = *foo+*foo1;
}else if(*foo>*foo1)
{
*result = *foo-*foo1;
}else
{
*result = *foo1-*foo2;
}
但我对此有疑问,我应该使用 0x0079 而不是 0079 还是应该使用 (int *)0800000079 作为我的一位朋友建议的
你朋友的建议很奇怪。我不知道他或她为什么要求婚 (int *)0800000079
,不过你可能需要演员表。
回归理智,0x0079
vs 0079
的问题不是代码问题,而是问题需求解读的问题:
- 如果
[=13=]79
表示十六进制,那么这是C++中的0x0079
(不是0079
,一个无效的八进制文字); - 如果你不知道
[=13=]79
是什么意思,你得向作者询问更多细节。
对于它的价值,在几种汇编语言(6502、摩托罗拉)、Pascal、Delphi、BASIC (Commodore)、Game Maker Language、Godot 和 Forth 的某些版本中,[=13=]79
将表示一个十六进制值。
您可能对此代码有疑问,但您的编译器不会 - 它会完全拒绝它。
以零数字开头的文字整数常量被解释为八进制(基数 8),因此可能只有 0 到 7 的数字。因此,例如 0079 是无效的。
因此,这些地址旨在为十进制(例如 79)或十六进制(基数 16 - 例如 0x79)。地址通常以十六进制表示,因此假设 0x0079 是预期的。
我认为建议 0800000079 是一个拼写错误,应该是 0x00000079?在这种情况下,0x79 与 0x00000079 的值相同 - int*
的类型转换是有效的,但不是绝对必要的,因为否则会发生隐式转换。
奇数地址对于 int
数据类型来说似乎不太可能,因为它通常是字对齐的 - 一些架构需要它,其他架构会生成额外的代码来访问未对齐的地址。如果奇数地址是正确的,它可能暗示一个 8 位目标,而 0x00000079 暗示一个 32 位地址总线——这似乎是一个不太可能的组合。
从本质上讲,这个问题似乎难以置信且定义不清;但是从表面上看,您的解决方案不必要地复杂;我会建议:
#define OP1 (*((int*)0x0079))
#define OP2 (*((int*)0x0179))
#define RESULT (*((int*)0x0279))
if( OP1 == OP2 )
{
RESULT = OP1 + OP2 ;
}
else
{
RESULT = OP1 - OP2 ;
}
此处宏的使用在一定程度上简化了语法。你的建议对 OP1 > OP2 进行了不必要的测试,最后一个 else 子句做同样的事情。只有两个互斥条件——等于或不等于,所以你只需要显式测试一个条件,因为其他一切都必须满足。在 C++ 中(你的标签暗示了一些语言的优柔寡断)你可以通过使用引用类型来避免宏(几乎总是一个好主意):
int& op1 = *((int*)0x0079) ;
int& op2 = *((int*)0x0179) ;
int& result = *((int*)0x0279) ;
if( op1 == op2 )
{
result = op1 + op2 ;
}
else
{
result = op1 - op2 ;
}