«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Еженедельный блог: Четыре интересных вещи, с которыми я столкнулся на этой неделе

Еженедельный блог: Четыре интересных вещи, с которыми я столкнулся на этой неделе

Опубликовано 8 ноября 2024 г.
Просматривать:390

1. Как избежать путаницы в именах файлов в коде VS

При написании файлов C в VS Code я сначала назвал файл.c.cpp. После завершения программы у меня возникли ошибки во время выполнения. После 30 минут устранения неполадок я обнаружил, что проблема кроется в имени файла:
Расширение .c привело к тому, что IDE ошибочно определила его как программу на языке C, в результате чего VS Code использовал gcc (компилятор C) вместо g (компилятор C) для компиляции моего кода.

Weekly Blog: Four Interesting Things I Encountered This Week

Подпись: Какой дурак!

  • Решение: в файле Tasks.json измените командную строку с gcc на g .
  • Извлеченный урок: используйте понятные расширения .cpp для файлов C, чтобы избежать ненужной путаницы.

2. Философия кроссплатформенного проектирования Java

Философия дизайна Java существенно отличается от традиционных компилируемых языков:

Традиционная подборка:

  1. Такие языки, как C, компилируются непосредственно в машинный код для конкретных целей. платформы (например, Windows, Mac, Linux)
  2. Полученные исполняемые файлы (.exe) можно запускать только на целевой платформе

Подход Java:

  1. Компилятор генерирует промежуточный код (байт-код)
  2. Этот байт-код может работать на любой платформе с установленной виртуальной машиной Java (JVM).
  3. JVM отвечает за перевод байт-кода в машинный код для текущей платформы

Эта конструкция достигает цели «Напишите один раз, запустите где угодно», тогда как исполняемые файлы C (файлы .exe) ограничены возможностью запуска на одной платформе.

  • Преимущества: Одна и та же программа может работать на разных компьютерах без изменений

  • Недостатки: Дополнительный шаг в процессе может немного замедлить компиляцию по сравнению с традиционными методами

Напиши один раз, беги куда угодно

                             ---------James Gosling

3. Два распространенных режима компиляции

  • Режим отладки ориентирован на отладку с меньшим количеством оптимизаций. В основном он используется для отладки программ.
  • Режим выпуска в основном используется для создания релизной версии с упором на оптимизацию и сохранением только базовых функций отладки.

Weekly Blog: Four Interesting Things I Encountered This Week

4. Понимание принудительного приведения типов с низкоуровневой точки зрения

Little Endian: младший байт хранится по наименьшему адресу. Этот метод хранения появился для облегчения чтения памяти ЦП, которое происходит от младшего к старшему адресу. Интересно, что это противоположно тому, как люди обычно пишут цифры.
Например:
Двоичное представление числа 329933: 00000000 00000101 00001000 11001101
Хранилище с прямым порядком байтов: 11001101 00001000 00000101 00000000
Как мы видим, Little Endian меняет порядок байтов в двоичном представлении. Однако очень важно отметить, что порядок битов внутри каждого байта остается неизменным!

Забавная игра для понимания принудительного приведения типов

Мой любимый эксперимент по приведению типов!

# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

Выход:

329933
-51

Мне любопытно, почему он выводит -51?

Объяснение

  1. (char*)&a указывает на первый байт целого числа. Первый байт 11001101 интерпретируется как символ.
  2. Самый старший бит 1 указывает на отрицательное число, после преобразования дополнения до двух мы получаем -51 (те друзья, которые знакомы с дополнением до двух, могут проверить, действительно ли оно представляет собой -51)

Это совпадение? Давайте попробуем еще два примера

printf("%d\n",*(q 1));
printf("%d\n",*(q 2));

Попробуйте:

  1. Попробуйте запустить упомянутый выше код и посмотрите результат.
  2. Подумайте, почему второй и третий байты выдают такой результат. Не стесняйтесь обсудить это в разделе комментариев.
  3. Можете ли вы применить принудительное приведение типов к другим типам данных? Попробуйте!

Дополнительная информация: Дополнение двоих.

При принудительном приведении типов (char)p будет указывать на адрес первого байта четырехбайтового целого числа, который равен 11001101.
Крайняя левая цифра 1 представляет отрицательный знак, указывая, что это отрицательное число. После применения дополнения до двух мы получаем: 0110011 (последние 7 бит)

(Примечание: для положительных чисел дополнение до двух — это просто двоичное представление десятичного числа. Для отрицательных чисел дополнение до двух получается путем инвертирования всех битов, кроме самого левого (старшего) бита, с последующим добавлением 1. в самый правый бит.)

Преобразование этого числа в десятичное число дает -51. Интересно, правда?

Преимущества дополнения двойки:

  1. Он позволяет вычислять как положительные, так и целочисленные типы, используя только сумматор, что устраняет необходимость в вычитателе и упрощает потребность в аппаратном обеспечении.
  2. Он обеспечивает уникальное двоичное представление нуля. 10000000 представляет собой не -0, а -128, а 00000000 представляет собой 0, а не 0.

Многие задаются вопросом, почему сейчас -128. Если вы знаете ответ, поделитесь им в комментариях. Это не только поможет другим, но и поможет вам организовать свои мысли.

Заявление о выпуске Эта статья воспроизводится по адресу: https://dev.to/stockdale_roger_999e292a7/weekly-blog-four-interesting-things-i-incountered-leek-eo9?1, если есть какие-либо нарушения, пожалуйста, свяжитесь с учебным системой @[email protected], чтобы Delete It.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3