我试图用一个声明解决一个问题“两个数字,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作为我的朋友之一建议
答案 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 ;
}