2013-05-15 4 views
1

Я видел, в каком коде C++ ключевое слово "без знака" в следующем виде:"без знака" ключевое слово

const int HASH_MASK = unsigned(-1) >> 1; 

и позже:

unsigned hash = HASH_SEED; 

(она берется из CS106B/X читатель - Стэнфорд - Эрик С. Робертс - на тему «реализация функции хеш-кода для строк»).

Может кто-нибудь сказать мне, пожалуйста, что означает это ключевое слово и когда я его использую?

Спасибо!

+0

Уже ответил здесь: http://stackoverflow.com/questions/621290/what-is-the-difference-between-signed-and-unsigned-variables –

+0

'Const INT HASH_MASK = MAX_INT;' кажется как лучшая ставка для меня. Или, наверное, 'std :: numeric_limits :: max()' в C++? –

ответ

0

Это короткая версия unsigned int. Синтаксически вы можете использовать его в любом месте, где бы вы ни использовали другой тип данных, например float или short.

1

Посмотрите: https://stackoverflow.com/a/7176690/1758762

без знака является модификатор, который может применяться к любому интегрального типа (полукокса, короткие, Int, длинные и т.д.), но само по себе оно идентично беззнаковое междунар ,

+0

Посмотрите: http://stackoverflow.com/q/336/1758762 – duDE

0

Неподписанные типы являются типами, которые не могут представлять отрицательные числа; только нулевые и положительные числа. В C++ они используют модульную арифметику; модуль для N -битного типа - 2^N. Рекомендуется использовать беззнаковые, а не подписанные типы при взаимодействии с битовыми шаблонами (например, при вычислении хэш-кодов), поскольку C++ допускает несколько разных представлений о отрицательных числах, что может привести к проблемам с переносимостью.

unsigned может использоваться как квалификатор для любого целочисленного типа (например, unsigned int или unsigned long long); или самостоятельно, как стенография для unsigned int.

Итак, первые конвертируют -1 в unsigned int. Благодаря модульной арифметике это дает наибольшее представимое значение. Это также можно было бы написать (точнее, на мой взгляд) как std::numeric_limits<unsigned>::max().

Вторая заявляет и инициализирует переменную типа unsigned int.

0

Значения подписаны по умолчанию, что означает, что они могут быть положительными или отрицательными. Ключевое слово unsigned используется для указания, что значение должно быть положительным.

Подписанные переменные используют 1 бит, чтобы указать, является ли значение положительным или нет. Непознанное ключевое слово actualy делает эту битовую часть значения (таким образом позволяя хранить большие числа).

И последнее, unsigned hash интерпретируется компиляторами как unsigned int hash (int является типом по умолчанию в программировании на языке C).

+0

Это было очень полезно, спасибо –

0

Чтобы понять, что означает unsigned, нужно понимать целые числа, подписанные и без знака. Для полного объяснения двойного комплимента поиск в Википедии, но в двух словах, компьютер сохраняет отрицательные числа, вычитая отрицательные числа из 2^32 (для 32-разрядного целого числа). Таким образом, -1 хранится как 2^32-1. Это означает, что у вас есть только 2^31 положительных чисел, но это у вас.Это известно как значащие целые числа (так как он может иметь положительный или отрицательный знак)

Unsigned сообщает компилятору, что вы не хотите комментировать два слова и имеете дело только в положительных числах. Когда -1 типаж (как это в коде) к неподписанных Int становится

2^32-1 = 0b111111111... 

Так что это простой способ получить целую кучу 1s в двоичном виде.

Используйте неподписанные редко. Если вам нужно выполнить бит-операции или по какой-то причине нуждаются только в положительных целых числах больше 2^31. В противном случае, если вы его не укажете, C++ принимает целые числа со знаком.

+0

Было очень полезно, спасибо –

0

C позволяет char s быть подписанным или без знака, в зависимости от того, что более эффективно для главного компьютера. если вы хотите, чтобы ваш char был неподписанным, вы можете объявить свою переменную unsigned char. Вы можете использовать signed char, если вы хотите обеспечить подписанную интерпретацию.

Кстати, составители С и С ++ treatd char, signed char и unsigned char в трех различных типов, даже если char собран в один из двух других.

Смежные вопросы