плюс, а когда только плюс ? то есть есть у нас один байт, если мы хотим хранить в нем числа в диапазоне от -128 до 127 у нас учитывается самый старший бит, если старший бит 0 то число положительное, 1 отрицательное, а если я знаю что я не буду хранить в этом байте отрицательные числа, и не нужно учитывать старший байт, чтобы можно было хранить много положительных чисел, от 0 до 255, то как это сказать компьютеру ?
Компьютер не знает вообще про отрицательные и положительные. И вообще, ты можешь оперировать с беззнаковым, но спокойно выводить это везде как отрицательное число. То есть, вот тебе и -255.
А как тогда при арифметических операций, компьютер "различает" что положительное а что отрицательное, и на выходе дает разные значения, например 5 + 5 = 10, а 5 + -5 = 0 ? ведь всю арифметику делает процессор.
Ты сам это написал - по верхним битам. Но это можно и игнорировать.
И как компиляторы или интерпретаторы на самом низком, двоичном уровне говорят компьютеру, игнорировать или не игнорировать ?
Ты шутишь? Никак! Это абстракция. Какая разница, что там в верхних битах? Ты решаешь, что это за значение.
Я это и спрашиваю, решаю я, значение минус или плюс, но как это решение донести до процессора, чтобы при сложении, вычитания или других арифметических операциях, он правильно считал, чтобы правильно считать -5 - 2 нужно различать отрицательное число, от положительного, чтобы получилось -7 а не 3
погоняй в калькуляторе примеры, или в дебаггере. все нюансы знаковой-беззнаковой арифметики уточнишь
для обычных операций такого не нужно. mul выполняет беззнаковое перемножение операнда и аккумулятора. imul выполняет знаковое перемножение операндов. div производит беззнаковое деление аккумулятора на операнд. idiv выполняет знаковое деление аккумулятора на операнд.
Компьютеру не надо говорить о том, что числа знаковые или беззнаковые. Знак числа у тебя исключительно в голове
У тебя есть инструкции neg для превращения отрицательного в положительное, и положительное в отрицательное. Используешь их для получения нужного значения.
Скорее как хочешь, так и интерпретируешь, как уже сказал КТ.
Поясняю, в обычные операции это заложено спецификацией работы отрицательных чисел, потому для них не нужно.
ты для этого и ставишь "-"
Мой первый вопрос немного отличается от тех что после, просто говоря, как хранить положительное число 255 в одном байте ?
0xFF = 255. Положительное?
И не только 255, положительные числа больше 127
Вот только байт не может хранить знаковое число больше 127
FFFFFFF1 = -15, при этом 4294967281. add eax, 1 ; FFFFFFF2 = -14, при этом 4294967282. Вот тебе и положительное, вот тебе и отрицательное. Так?
Как компьютеру понять, число 10000011 это 1*2^8 + 0*2^7 ... + 1*2^1 + 1*2^0 или - (0*2^7 ... + 1*2^1 + 1*2^0) чтобы при арифметических - и + ответ был верным ?
Никак. Ответ и так будет верным, смотри выше.
Знаковое да, а беззнаковое, где граниться между знаковым, и без знаковым ?
При операциях сложения и вычитания результат не зависит от того, делаешь ли ты их над знаковыми или без знаковыми числами
проблемы при умножении, для знаковых коррекция нужна, про деление не помню
Тоже нужна коррекция
Коррекция? imul/idiv просто писать, и всё.
Если пк плевать на знаковое число, или не знаковое, то -2 + 1 это 3 а не 1
Ну это видимо под коррекцией и подразумевается
я про абстрактый сферический ассемблер в вакууме
Без знаковое 2 не равно знаковому -2
Нет, -2+1 это -1))
Вот и вопрос, где граница между -2 и 2 ?
ой сорри
когда нет умножения/деления, например
-2 в беззнаковом виде равно 254, если мы говорим о байте
Это какой-нибудь ARM?
Соответственно, когда ты прибавишь к нему 1, ты получишь 255 - что соответствует знаковому -1
-1 = 255 = 65535
Но при этом это всегда можно и интерпретировать как 255.
Ну да, по факту это вообще 11111111
вроде армы все с умножениями и делениями, я про 8-битные
Пк не нужно знать число с знаком или без, но знаковое число больше 127 нельзя хранить в одном байте ? где логика ? как пк понять что 10000001 это не -1 а большое беззнаковое число, чтобы использовать его в арифметике не как -1 а как то самое большое положительное число ?
У тебя есть 8 ячеек, каждая из которых может хранить число 0 или 1
Короче, садись за калькулятор и смотри. Всё поймёшь.
чел читай модульную арифметику
Базовые арифметические операции - сложение и вычитание - делаются так, что абсолютно не важно, будут они производиться над знаковыми или без знаковыми числом.
То что вычеркнул бред, согласен
Ну потому что 10000001 это не -1 вообще ни разу.
записываешь туда или -1 или 255
покажи свои бинарные расчеты
Западло в том, что при записывании -1 - пишется почему-то 255. В чём же дело...
никак, формат отрицательных чисел и придумали чтоб в бинарном формате сложение/вычитаение делались по одному алгоритму
где пишется, кем пишется, что пишется?
Ассемблером, отладчиком и т.д. Это я про то, что все отрицательные - и есть положительные, и часть положительных - и есть отрицательные.
ну да, это тебе не питон
в душе не знаю, но думаю там никогда не всплывают такие вопросы "Как компьютеру понять, число 10000011 это 1*2^8 + 0*2^7 ... + 1*2^1 + 1*2^0 или - (0*2^7 ... + 1*2^1 + 1*2^0) чтобы при арифметических - и + ответ был верным ?"
Да в ассемблере тоже бы не всплывали, просто запутался человек между тремя берёзами. Чего тут понимать? sub/add и так работают - потому что отрицательные расположены в таком порядке (от меньшего к большему), что получается при сложении\вычитании - можно часть положительных всегда интерпретировать как отрицательные. И если надо знаковое число, а не адрес - делаешь idiv/imul, а не div/mul. Так начал же придумывать какие-то ненормальные вычисления, степени, что-то там размышлять про отдельные числа...
Обсуждают сегодня