Пояснить суть модификатора типа unsigned - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Как я понимаю модификаторы типов придуманы для того, чтобы хранить значения переменных, которые не могут быть отрицательными масса, возраст и т.п. (в данном случае я говорю об unsigned). Исходя из интернет источников unsigned int имеет минимальное значение 0 и максимальное 4294967296. Для этого решил просто ради интереса проверить, что мне выдаст компилятор если для переменной типа unsigned int присвоить отрицательное значение. Ни тебе error'ов ни даже warning'ов. Вопрос почему программа компилируется без каких либо ошибок или хотя бы предупреждений??? Чего такого таинственного еще скрывается под модификатором типа unsigned? (умею читать поэтому ссылке также буду рад) Спасибо!!!
#include<stdio.h>
 
int main() {
unsigned int i = -12345;
printf("%d\n",i);
 
return 0;
}

Решение задачи: «Пояснить суть модификатора типа unsigned»

textual
Листинг программы
#include <stdio.h>
 
int main(void) {
    printf("%x %x\n", (-1) >> 1, (unsigned)(-1) >> 1);
    return 0;
}

Объяснение кода листинга программы

В данном коде выполняется следующие действия:

  1. #include - подключается стандартная библиотека ввода/вывода, которая позволяет выводить информацию на экран.
  2. int main(void) - определяется главная функция программы, которая содержит весь основной код программы.
  3. printf(%x %x\n, (-1) >> 1, (unsigned)(-1) >> 1); - выводится информация на экран с помощью функции printf().
    • %x %x\n - это формат вывода, где %x указывает на вывод шестнадцатеричного числа, а \n - перенос строки.
    • (-1) >> 1 - выражение, в котором сдвиг вправо (-1) на 1 бит (-1 >> 1 = 0).
    • (unsigned)(-1) >> 1 - выражение, в котором сначала приводится (-1) к беззнаковому типу (unsigned), а затем выполняется сдвиг вправо на 1 бит (unsigned(-1) >> 1 = 33554431).
  4. return 0; - функция main() возвращает 0, что означает успешный конец работы программы. Итак, в данном коде выводится на экран шестнадцатеричное число 0x00000001 и 0xFFFFFFFF. При этом 0x00000001 - это то же самое, что и 1, а 0xFFFFFFFF - это -1 в беззнаковом формате. Это происходит потому, что в беззнаковом формате сдвиг вправо на 1 бит приводит к увеличению числа на 1, а в знаковом формате, как в данном случае с int, сдвиг вправо на 1 бит приводит к переходу от -1 к 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5