LINUX.ORG.RU

Читая Кнута

 ,


0

1

Кто-нибудь может объяснить разницу между этими инструкциями?

NEG $X,Y,$Z (negate): s($X) := (Y - s($Z)). NEGU $X,Y,$Z (negate unsigned): u($X) := (Y - u($Z)) mod 2^64.

Дoпустим, $Z = 0xFFFFFFFFFFFFFFFF, Y = 0

Тогда первая инструкция даст $x = 0 - (-1) = 1 Вторая даст (0 - (2^64 - 1)) mod 2^64 = 1

А в чем разница?

★★★

Угловые кейсы я вроде перебрал, разобрался. Но остались непонятки с mod. В разных языках он реализован по разному. Предполагаю что Кнут обрезает 64-й бит (если считать с нуля).

class Program {
        static void Main(string[] args) {
            for (int i = 0; i < 4 ; i++)
                for (int j = -2; j < 2; j++)
                {
                    int i1 = i - j;
                    int i2 = (i - sgn2(j)) & 3;
                    Console.WriteLine(string.Format("neg {0} {1} = {2}\n", i, j, i1));
                    Console.WriteLine(string.Format("negu {0} {1} = {2}\n", i, j, i2));
                }
        }

        static int sgn2(int arg) {
            switch (arg) {
                case -2:
                    return 2;
                case -1:
                    return 3;
                case 0:
                    return 0;
                case 1:
                    return 1;
                default:
                    throw new Exception("Unexpected");
            }
        }
    }
Absurd ★★★
() автор топика
Ответ на: комментарий от Erfinder

Там регистры могут нести любую нагрузку включая значения с плавающей точкой. Инструкции интерпретируют их по разному.

Absurd ★★★
() автор топика
Последнее исправление: Absurd (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.