Добрый день!
Думаю типы данных С ни для кого не являются секретом.
Char - 1 байт
Int - 4 байта (для 32 разрядных машин) и т.д.
Так же ни для кого не является секретом, что числа машина хранит в двоичном коде.
Dec Bin
0 0
1 1
2 10
3 11
и т.д.
Соответственно единица типа Int будет выглядеть
следующим образом: 00000000 00000000 00000000 00000001.
Для просмотра чисел в нативном машинном формате можно реализовать простейший код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/*
Просмотр чисел в шестнадцатиричной и двоичной системе счисления
*/
int main()
{
system("chcp 1251 > nul");
int num;
printf("Введите число: ");
scanf("%d", &num);
printf("\nDEC - %d\tHEX - %#X\tBIN - %d%d%d%d%d%d%d%d %d%d%d%d%d%d%d%d %d%d%d%d%d%d%d%d %d%d%d%d%d%d%d%d\n", num, num, num>>31, (num>>30)%2, (num>>29)%2, (num>>28)%2, (num>>27)%2,(num>>26)%2, (num>>25)%2, (num>>24)%2,
(num >> 23)%2,(num >> 22)%2,(num >> 21)%2,(num >> 20)%2,(num >> 19)%2,(num >> 18)%2,(num >> 17)%2,(num >> 16)%2,
(num >> 15)%2,(num >> 14)%2,(num >> 13)%2,(num >> 12)%2,(num >> 11)%2,(num >> 10)%2,(num >> 9)%2,(num >> 8)%2,
(num >> 7) %2,(num >> 6) %2,(num >> 5) %2,(num >> 4) %2,(num >> 3) %2,(num >> 2) %2,(num >> 1) %2,num % 2);
return 0;
}
Вот, к примеру, вывод для числа 2147483647, которое является максимальным для 4 байтного signed int
Видно, что заполнены все разряды кроме старшего, который отвечает за знак числа. Отрицательные числа хранятся в комплиментарной форме. Старший разряд у них выставлен в 1.
Вот вывод для числа -2147483648
Но если вывести число -1
Вместо каждого разряда заполненного "1", мы получаем "-1".
Собственно это и есть мой вопрос - Почему так? Откуда знак "-"?