Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как компьютер определяет что в памяти записано знаковое или беззнаковое число?

punkochel Ученик (243), закрыт 3 года назад
Если я захочу вывести на экран число из ячейки памяти, то как компьютер узнает что нужно отобразить -1, а не 255? При этом оба эти числа записываются в памяти как 1111 1111.
Лучший ответ
Федор Новиков Искусственный Интеллект (367277) 3 года назад
Как написано в программе в преобразовании числа в текст, так и определяет. Тип хранится не в ячейке, а указывается в коде команды (знаковое умножение и беззнаковое умножение имеют разные коды команд и т. п.)
Остальные ответы
Пенек Лисицын Оракул (75180) 3 года назад
Не мож быть, тем более что комбинация из 8 цифр даст больше чем 255
Posteriori Просветленный (24475) 3 года назад
Я бы тоже хотел узнать.
Всё что знаю по этому поводу - компьютер использует дополнительный код.
Это когда реверсируешь число и добавляешь единицу.
Есть ещё предположение, что он для этого специальные знаки типа мантиссы использует
kaiu Высший разум (120172) 3 года назад
Тебе же блин ответили!
Для языка си
unsigned char a; // это без знака выведет, а значит 255 покажет или 0xFF для шестнадцетеричного
char a; // покажет -1
punkochelУченик (243) 3 года назад
При чем тут вообще любой ЯП? Это на ассемблере можно все сделать.
kaiu Высший разум (120172) punkochel, на ассемблере я сам пишу вывод, хоть в виде MIN напишу
Двоечник Обыкновенный Высший разум (106561) 3 года назад
Какие символы или цифры отобразить решает программа, которую ты запускаешь. Для неё нет разницы, число там или текст. В программе все в единицах и нулях. Но тот, кто пишет программу определяет способ представления информации конечному пользователю.
Аглая Шниц Искусственный Интеллект (147661) 3 года назад
ты ему сам скажешь, как интерпретировать эти единицы.

char c = 0xFF;

// как символ:
printf("as char: %c\n", c);

// как целое со знаком:
printf("as int: %hhd\n", c);

// как целое без знака:
printf("as unsigned int: %hhu\n", c);
punkochelУченик (243) 3 года назад
int var = 255; // запишется в памяти как 1111 1111
int var2 = -1; // запишется в памяти как 1111 111
Ладно, возьмем С. Там мы пишем printf("%d, %d", var, var2); и результат будет 255, -1. Как программа определила что var и var2 имеют разные знаки, если в памяти они хранились 1111 1111?
Аглая Шниц Искусственный Интеллект (147661) int четырехбайтовый, емнип. чтобы понять, как он выглядит в памяти, можно сделать так: int var = 255; char *byte = &var; printf("%hhx %hhx %hhx %hhx\n", byte[0], byte[1], byte[2], byte[3] ); 255 даст результат ff 00 00 00 -1 даст результат ff ff ff ff когда printf видит %d, он прочухивает, что от него ждут int, и рисует то, что интерпретируется как int.
Батаев Дмитрий Просветленный (23290) 3 года назад
со времён бейсика переменные объявлялись спецификатором, в котором указывался тип переменной - int, double, string и далее следовал идентификатор. По-любому идентификатор превращался в адрес хранения ПЕРВОЙ ячейки памяти, а вот по спецификатору программа понимает, что работать нужно с 4, 8 или строкой из стольких байт, сколько указазал для размера строковой переменной "программист" )))
Батаев ДмитрийПросветленный (23290) 3 года назад
ищите, точнее обращайтесь к истокам программирования в частности описание языка бейсик и там пользователям доходчиво объяснялось КАК расположены переменные технически в памяти, что и сколько занимают. Про уточнение имён переменных не говорю, там еще посложнее ))
Батаев ДмитрийПросветленный (23290) 3 года назад
ищите книги 80-х и 90-х годов. Многие программисты из молодых даже представление не имеют как оно работает в принципе
Krab Bark Искусственный Интеллект (299951) 3 года назад
Он об этом узнает из команд программы.
Похожие вопросы