@plat_on

Представление чисел в С

Добрый день!
Думаю типы данных С ни для кого не являются секретом.
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
0d442254c2e94c3daaeca7e5da997090.jpg

Видно, что заполнены все разряды кроме старшего, который отвечает за знак числа. Отрицательные числа хранятся в комплиментарной форме. Старший разряд у них выставлен в 1.
Вот вывод для числа -2147483648
261fe447683147298fc41851a4cf985a.jpg
Но если вывести число -1
7c484d4d5eb447ca934b5c78ad6dca27.jpg
Вместо каждого разряда заполненного "1", мы получаем "-1".
Собственно это и есть мой вопрос - Почему так? Откуда знак "-"?
  • Вопрос задан
  • 2340 просмотров
Решения вопроса 1
fornit1917
@fornit1917
У вас используется операция остатка от деления (%). Остаток от деления отрицательного числа на положительное дает либо 0, либо отрицательное число
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы