Как Microsoft Visual C ++ хранит подписанные символы и как я могу проверить отдельные биты в подписанном символе? - PullRequest
0 голосов
/ 29 декабря 2011

ОК, скажем, у меня есть подписанный символ со значением -103:

char s_char = -103;

Как компьютер хранит этот символ в битах? Первый бит 0, потому что символ отрицателен? Если это так, будет ли компьютер хранить символ как 01100101, потому что 1100101 (база 2) в базе 10 равна 103?

И второй вопрос: как я могу получить доступ или проверить один бит в подписанном символе? Будет

s_char & (0x80 >> pos)

дайте мне значение бита в позиции pos, считая слева?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

char это просто целое число. 8-битные целые числа в большинстве случаев. Так что -103 это просто:

10011001

Чтобы получить доступ к одному биту в char, вы можете сделать это так же, как любое другое целое число:

char s_char = -103;

s_char & (1 << n)

даст вам n-й бит снизу.

2 голосов
/ 29 декабря 2011

Подписанные значения обычно хранятся с использованием дополнения Two.http://en.wikipedia.org/wiki/Two%27s_complement

По существу, это обеспечивает бит со знаком, который определяет, является ли сохраненное число отрицательным или положительным.Например, если вы используете 8-битное целое число, диапазон возможных чисел со знаком составляет от -128 до 127. Это разбивается на серию из 8 битов, например, где самый левый бит представляет значение -128.,Последующие биты удерживают половину значения как бит слева, но вместо этого являются положительными.8-битное число в двоичной форме будет выглядеть так:

0    0    0    0    0    0    0    0
-128 64   32   16   8    4    2    1

Поскольку char является целочисленным типом, оно будет сохраняться так же, как и обычное int.Значение char со значением -103 может распасться на что-то вроде этого:

1    0    0    1    1    0    0    1
-128 64   32   16   8    4    2    1

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

s_char & (0x80)

Это вернет true, если самый левый бит был установлен в 1 в s_char, независимо отдругие биты.Я надеюсь, что это помогает!

...