2014-12-22 2 views
12

Я занимаюсь кодированием X11 ctypes, я не знаю C, но мне нужна помощь в понимании этого.Что означает (~ 0L)?

В коде C ниже (может быть, C++ им не уверен) мы видим (~0L), что это значит? В Javascript и Python ~0 означает -1.

812 int result = GetProperty(window, property_name, 
813       (~0L), // (all of them) 
814       &type, &format, &num_items, &properties); 

Благодаря

ответ

18

0L - целочисленное значение long со всеми битами, установленными в ноль - это обычно определение 0. ~ означает инвертировать все биты, что оставляет вас с целым числом long со всеми битами, установленными в единицу.

В двухрядной арифметике (которая почти универсальна) знаковое значение со всеми битами, установленными в единицу, равно -1.

Причина использования ~0L вместо -1L должна быть более четкой в ​​отношении намерения - оно не предназначено для использования в качестве номера вообще, а скорее как набор бит.

+0

Спасибо, столько же! Поэтому число, которое я должен использовать в моих типах, это '1111111111111111111111111111111111', если программное обеспечение 32 бит и 64 1, если его 64-битный' 1111111111111111111111111111111111111111111111111111111111111111'? – Noitidart

+2

Проблема в том, что если параметр, который вы вызываете, является 'long long', тогда' ~ 0L' инвертирует только некоторые из битов, тогда как '-1' (без суффикса) инвертирует все из них. –

+2

@Noitidart это зависит от вашего определения 'long'. Microsoft определяет его как 32 бита, даже для 64-битного программного обеспечения. –

3

побитового комплимента нуля длинного типа.

+0

Я не компьютерный научный парень, просто любитель. Ха-ха, так что это как чужой разговор со мной: P Это '-1'? Мне нужно число, которое нужно ввести в мои ctypes: P – Noitidart

+3

@No: Почти, по крайней мере, на реализациях двух дополнений: '-1L' В любом случае, почему бы просто не использовать одно и то же выражение в C++? – Deduplicator

+0

Спасибо @Deduplicator. Я больше смущен сейчас, ха-ха, а что делать? haha означает, что это означает 64-битное или 32-битное программное обеспечение? Так что если я поставлю '-1', это будет нормально? У нас нет 'L' в ctypes. – Noitidart

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