Как создать отрицательное двоичное число с использованием подписи / без знака в C? - PullRequest
0 голосов
/ 02 февраля 2019

Мои мысли: если кто-то объявляет int, он в основном получает unsigned int.Поэтому, если мне нужно отрицательное значение, я должен явно создать подписанное целое число.

Я пытался

int a = 0b10000101;
printf("%d", a); // i get 138 ,what i've expected
signed int b = 0b10000101; // here i expect -10, but i also get 138
printf("%d", b); // also tried %u

Так я ошибаюсь, что целое число в двоичной системе со знаком является отрицательным значением?
Как я могу создать отрицательное значение в двоичном формате?

Редактировать Даже если я использую 16/32/64 бит, я получаю тот же результат.unsigned/signed doest, кажется, имеет значение без ручного сдвига битов.

Ответы [ 4 ]

0 голосов
/ 02 февраля 2019

Как создать отрицательное двоичное число с помощью знака / без знака в C?

Просто отрицайте константу положительного значения.Попытка сделать это с many 1's ... 1110110 предполагает битовую ширину для int.Лучше быть портативным.

#include <stdio.h>

int main(void) {
  #define NEGATIVE_BINARY_NUMBER (-0b1010)
  printf("%d\n", NEGATIVE_BINARY_NUMBER);
}

Вывод

-10
0 голосов
/ 02 февраля 2019

потому что int a = 0b10000101 имеет только 8 бит, где вам нужно 16 или 32. Попробуйте thi:

int a = 0b10000000000000000000000000000101

, которое должно создать отрицательное число, если ваша машина 32 бита.Если это не работает, попробуйте:

int a = 0b1000000000000101

. Есть и другие способы получения отрицательных чисел:

int a = 0b1 << 31 + 0b101

или если у вас 16-битная система

int a = 0b1 << 15 + 0b101

или этот будет работать для обоих 32 или 16 бит

int a = ~0b0 * 0b101

, или это другой, который будет работать на обоих, если вы хотите получить -5

int a = ~0b101 + 1

так 0b1015 в двоичном коде, ~0b101 дает -6, поэтому, чтобы получить -5, вы добавляете 1

РЕДАКТИРОВАТЬ: так как теперь я вижу, что у вас есть путаница, что такое числа со знаком и без знака, япостараюсь объяснить это как можно проще int

Так что когда у вас есть:

 int a = 5;

- это то же самое, что:

 signed int a = 5;

и обабыло бы позитивно.Теперь это будет так же, как:

 unsigned int a = 5;

, потому что 5 - положительное число.

С другой стороны, если у вас есть:

int a = -5;

, это будетбудет таким же, как

signed int a = -5;

, но это будет не то же самое, что и:

unsigned int a = -5;

первый 2 будет -5, третий не тот,На самом деле это было бы то же самое, если бы вы ввели 4294967291, потому что они одинаковы в двоичной форме, но тот факт, что вы подписали без знака, означает, что компилятор будет хранить его таким же образом, но будет воспринимать его как положительное значение.

0 голосов
/ 02 февраля 2019

Если числа представлены как дополнение к двум, вам просто нужно установить бит знака, чтобы убедиться, что число отрицательное.Это MSB.Если int составляет 32 бита, то 0b11111111111111111111111111111111 равно -1, а 0b10000000000000000000000000000000 равно INT_MIN.

Чтобы настроить размер int(8|16|64)_t, просто измените количество бит.Знаковый бит - все еще MSB.

0 голосов
/ 02 февраля 2019

Имейте в виду, что, в зависимости от вашей цели, int может составлять 2 или 4 байта.Это означает, что int a=0b10000101 недостаточно для установки бит знака.

Если ваш int равен 4 байта, вам нужно 0b10000000 0000000 0000000 00000000 (пробелы добавлены для ясности).

Например, для 32-битной цели:

int b = 0b11111111111111111111111111111110; 
printf("%d\n", b);   // prints -2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...