Понимание вывода утилиты od в отношении флотов 'od -t f'

Оболочка действительно имеет какое-то отношение к этому сообщению, и crsh косвенно вызывает оболочку, которая, вероятно, является bash .

Я написал небольшую программу на C, которая всегда выделяет ошибки:

#include <stdio.h>

int
main(int ac, char **av)
{
        int *i = NULL;

        *i = 12;

        return 0;
}

Когда я запускаю ее из своей оболочки по умолчанию, zsh , я получаю следующее:

4 % ./segv
zsh: 13512 segmentation fault  ./segv

Когда я запускаю ее из bash , я понимаю то, что вы отметили в своем вопросе:

bediger@flq123:csrc % ./segv
Segmentation fault

Я собирался написать обработчик сигнала в своем коде, затем я понял, что вызов библиотеки system () , используемый crsh exec - это оболочка, / bin / sh в соответствии с системой man 3 . Этот / bin / sh почти наверняка выводит «Ошибка сегментации», поскольку crsh определенно нет.

Если вы переписываете crsh , чтобы использовать системный вызов execve () для запуска программы, вы не увидите строку «Ошибка сегментации». Он исходит из оболочки, вызываемой system () .

2
05.10.2018, 15:08
1 ответ

В системах с малым -порядком байтов это результат представления в памяти строк, чисел с плавающей запятой и двойных чисел. Начиная с «A», 65 или 0x41, как число с плавающей запятой (od -t fF), это соответствует

00000000000000000000000001000001

что равно 9,1⋅10-44(см. этот удобный преобразователь)— 0 бит для знака (положительный ), 0 показатель степени (, который смещен, на -126 для числа с плавающей запятой )и дроби 2-17 + 2-23 . Таким образом, представленное значение равно (2-17 + 2-23)× 2-126(см. Wolfram Alpha). Добавление новой строки приводит к

00000000000000000000101001000001

, что равно 3,678⋅10-42 .

Использование удвоений(od -t fD)добавляет еще четыре байта нулей к началу числа, что не меняет знак или показатель степени, и еще больше уменьшает дробь, что помимо большего смещения для удвоений (-1022 ), приводит к очень маленьким числам, которые вы видите (см. этот другой конвертер, который использует двойные числа):«A» (2-46 + 2-52)× 2-1022(см. Wolfram Alpha ), «A» с последующей новой строкой: (2-41 + 2-43 + 2-46 + 2-52)× 2-1022(см. Wolfram Alpha ).

2
27.01.2020, 22:08

Теги

Похожие вопросы