[ad_1]
したがって、単純なスタックベースの仮想マシンを作成しようとしています。スタックを int8_t 型の配列にして、すべての要素が 1 バイトになるようにします。 しかし、私はバイトだけで作業したくありません。16、32、および 64 ビットの数値も使用したいので、ビットマスクが必要です。
これは現在のコードです:
C++
#include <stdint.h> #include <stdio.h> #define STACKSIZE 65536 int8_t stack[STACKSIZE]; void push(int8_t); int8_t pop(); void pushw(int16_t); int16_t popw(); int64_t top = -1; int main() { pushw(938); for (int i = 0; i < 10; i++) { printf("%d\n", stack[i]); } printf("\n\n%d", popw()); return 0; } void push(int8_t x) { if (rsp == STACKSIZE - 1) { printf("Overflow!"); } else { rsp++; stack[rsp] = x; } } int8_t pop() { if (rsp == -1) { printf("Underflow"); return -1; } else { rsp--; return stack[rsp + 1]; } } //LSB-MSB at push //MSH-LSB at pop void pushw(int16_t x) { push(x & 0x00FF); push(x & 0xFF00); } int16_t popw() { int16_t r = pop(); r |= (pop() << 8); return r; }
期待される出力:
234 //I am not too good at decimal-binary conversion, but i think these are right 2 0 0 0 0 0 0 0 0 938
私が代わりに得るもの:
-86 0 0 0 0 0 0 0 0 0 -22016
助けてください。
私が試したこと:
順序を変更しようとしましたが、最初の 2 つの数字として 0, -86 が返され、最後に popw(); で -86 が返されました。
解決策 1
プッシュする前に上位バイトをシフトする必要があります。
void pushw(int16_t x) {
プッシュ (x & 0x00FF);
プッシュ ((x & 0xFF00) >> 8);
}
[ad_2]
コメント