【发布时间】:2012-01-12 19:44:31
【问题描述】:
我在 C 中有这个 case 语句:
case GOTO: {
int o1 = (int)P[pc+1];
unsigned int o2 = (unsigned)P[pc+2];
int offset =(o1<<8) | o2;
pc = pc + (int)offset;
break;
}
现在关于代码:
P[pc+x] 将给出一个 1 字节整数。
基本上在这结束时,我想将pc 设置为有符号的4 字节int。然而,它并没有这样做。它正在做的是获取1 字节,将其移动,然后获取第二个字节,然后按位或,然后简单地添加它。它没有考虑 o1 的符号。所以,如果P[pc+1] = FF 和P[pc+2] = E1,发生的是offset = 0000FFE1。然而,我想要的是offset = FFFFFFE1。基本上,第一个2 字节应该采用P[pc+1] 的符号。但这并没有发生。我做错了什么?
【问题讨论】:
-
你还能显示数组 P 的类型吗?也许添加以下演员可能会有所帮助: int o1 = (int)(int8_t)P[pc+1];无符号整数 o2 = (无符号)(uint8_t)P[pc+2]; int 偏移量 = (int)((o1
-
请贴出
P和pc的声明,以及INT()的定义。 -
糟糕,INT() 不应该存在,假装它不存在。而P是字节数组,pc是访问其索引的一种方式。
-
如果它不应该存在,请将其编辑掉。编辑所有声明。