在特定地址存储答案

时间:2015-03-26 13:18:51

标签: c++ c embedded

我试图用一个声明解决一个问题“两个数字,x并分别存储在内存位置$ 0079和$ 0179。写一个C代码,用两个指针读取这两个数字。比较数字,如果它们是相同的,添加它们。如果它们不同,则减去它们。将操作结果写在地址$ 0279“

现在我想到的解决方案是

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作为我的朋友之一建议

2 个答案:

答案 0 :(得分:2)

你朋友的建议很奇怪。我不知道为什么他或她提出了(int *)0800000079,尽管你可能需要演员。

回到理智,0x0079 vs 0079的问题不是代码问题,而是解释问题要求的问题:

  • 如果$0079表示十六进制,那么这是C ++中的0x0079 0079,一个无效的八进制文字);
  • 如果你不知道$0079表示什么,你将不得不向作者询问更多细节。

对于它的价值,在几种汇编语言(6502,摩托罗拉),Pascal,Delphi,BASIC(Commodore),Game Maker语言,Godot和Forth的某些版本中,$0079将表示十六进制值。

答案 1 :(得分:2)

您可能对此代码有疑问,但您的编译器不会 - 它会完全拒绝它。

以零数字开头的文字整数常量被解释为八进制(基数为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 ;
}