Вычтите целые числа со знаком в JavaScript - PullRequest
1 голос
/ 27 февраля 2012

Я хочу вычесть два 8-битных целых числа со знаком в JavaScript. Поскольку в JavaScript нет типа для целых чисел со знаком или без знака, мне нужно придерживаться типа «число» - и я не могу совершать «магию приведения» так же, как это было бы возможно на разных языках.

Я хочу смоделировать своего рода регистр ЦП и поэтому должен работать как со знаковыми, так и со знаковыми значениями. Дополнительно мне нужно рассчитать значения флага Carry и Overflow. Флаг переноса устанавливается, когда происходит переполнение без знака (значение без знака вышло из диапазона от 0 до 255), а флаг переполнения устанавливается при переполнении со знаком (значение не является вне диапазона -128 - 127).

Этот код, кажется, работает, но довольно громоздок и уродлив. Есть ли какой-нибудь "простой" способ сделать этот расчет?

Заранее спасибо!

//Convert a signed 8bit number to a "real" number (254 => -2)
function toSigned(number)
{
    if (number & 0x80) //sign bit is set
        number = -(0x100 - number);
    return number
}
//Inverts the sign of a signed 8bit number
function invertSign(number)
{
    return 0x100 - number;
}
//subtracts source from target
function sub(target,source)
{
    //calculate carry
    var carry = (target - source < 0);
    console.log("Carry: %b", carry);

    //Calculate result & overflow
    var result = (target + invertSign(source)) & 0xFF;
    var overflow = !(result >= -128 && result <= 127);
    console.log("Overflow: %b", overflow);
    console.log("Result: %d - %d = %d",toSigned(target),toSigned(source),result);
}
//Examples
sub(8,254); //8 - (-2), no overflow, carry set
sub(8,2); //8 - 2, no overflow, no carry
sub(0x50,0xB0); //80 - (-80), overflow, carry

1 Ответ

1 голос
/ 27 февраля 2012

Похоже, что одним из лучших вариантов для вас является Typed Arrays (он поддерживается не всеми браузерами, см. Можно ли использовать: typedarrays)

var signed8bitArray = new Int8Array(1);
var unsigned8bitArray = new Uint8Array(1);

unsigned8bitArray[0] = 254;
signed8bitArray[0] = unsigned8bitArray[0];
signed8bitArray[0] == -2 // This is true

Возможно, вы захотите прочитать Int8Array, Uint8Array и общую документацию по типизированным массивам JavaScript из MDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...