Задать вопрос
@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".
Собственно это и есть мой вопрос - Почему так? Откуда знак "-"?
  • Вопрос задан
  • 2341 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
fornit1917
@fornit1917
У вас используется операция остатка от деления (%). Остаток от деления отрицательного числа на положительное дает либо 0, либо отрицательное число
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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