Объекты типа int
представлены в памяти различными битами. Подпрограмма write
передает именно эти биты памяти по назначению.
Терминалы не предназначены для отображения произвольных битов памяти. Они не интерпретируют биты как int
или другой объект, а затем отображают эту интерпретацию. Как правило, мы передаем символов на терминалы. Более конкретно, мы отправляем коды, которые представляют символы. Терминалы предназначены для получения этих кодов и отображения небольших картинок письма (символы, глифы, эмодзи и т. Д.).
Чтобы сделать вывод терминала «7», нам нужно отправить ему код «7». Общей системой кодирования символов является ASCII (американский стандартный код для обмена информацией). Код ASCII для «7» - 55. Итак, если вы сделаете это:
char x = 55;
write(1, &x, 1);
, то терминал отобразит «7» на своем дисплее, если используется ASCII.
Таким образом, write
- это неправильная процедура, используемая для отображения значений int
, которые человек может прочитать. Вместо этого вы обычно используете printf
, например:
printf("%d", n);
f
в printf
означает formatted
. Он проверяет биты, представляющие значение в n
, и форматирует представленное значение в виде символов, предназначенных для чтения людьми, а затем записывает эти символы в стандартный вывод.
Если вы хотите использовать write
дляДля передачи символов в терминал вы можете использовать sprintf
, чтобы получить только часть форматирования printf
без печатной части. Для начала этот код будет работать:
char buffer[80]; // Make space for sprintf to work in.
int LengthUsed = sprintf(buffer, "%d", n); // Format n in decimal.
write(1, buffer, LengthUsed); // Write the characters.
(более сложный код адаптирует размер буфера к тому, что необходимо для sprintf
.)