Как создать длинное число всех битов в 1

Мне нужно передать ~0L в мою функцию, как я могу это сделать, независимо от того, что я делаю ~0 превращается в -1

Это код C:

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

Это мои jsctypes:

var result = GetProperty(window, property_name, ctypes.long(~0), type.address(), format.address(), num_items.address(), properties.address()

Обратите внимание на ctypes.long(~0), как сделать так, чтобы 111111111111111111111111111111 для 32-битной косой черты было равно 64 1 для 64-битной?

Спасибо

справочная тема: Что означает (~0L)?


person Noitidart    schedule 22.12.2014    source источник


Ответы (2)


объявить его беззнаковым длинным, ~0UL

person Andras    schedule 22.12.2014
comment
Мне пришлось погуглить, но правильно ли выглядит ctypes.unsigned_long(~0)? Обязательно объявите соответствующий код C++ как ожидающий unsigned long. В C++ ~0 (все биты установлены) также представляет собой -1L; обрабатывается ли он как -1L или ~0UL, зависит от того, как он объявлен. - person Andras; 22.12.2014
comment
О, я думал, ты парень с js-ctypes. Да, я пробовал это, я не уверен, что это правильный способ сделать это. Я не получаю данные, которые могут иметь какое-то отношение к этому. - person Noitidart; 22.12.2014
comment
нет, я больше разбираюсь в C/C++/nodejs. Я написал плагины nodejs. Если вы не получаете данные, попробуйте распечатать все, что вы получаете на стороне C, это может помочь показать, что происходит. - person Andras; 22.12.2014

Решение состояло в том, чтобы использовать ctypes.long(~0), это хорошо для 32-битной и 64-битной версии :) Спасибо @arai.

21:45 noida как использовать ~0L в jsctypes?

22:07 араи нойда: 32-битная или 64-битная?

22:11 noida можешь показать мне как сделать для обоих плз

22:17 arai noida: Думаю, ctypes.int32_t(~0) и ctypes.int64_t(~0) будут работать

22:20 Нойда -0x80000000

22:20 noida, это не сработает, да?

22:20 arai использует ctypes.long для параметра, так что ctypes.long(~0) будет лучше

22:23 arai ~0L — это 0xFFFFFFFFFFFFFFFF, верно?

22:24 noida я думал это: 0x7ffffff

22:29 арай printf("%lx\n", ~0L); выводит ffffffffffffffffff

22:31 arai было бы лучше использовать ctypes.long(~0) для согласованности

22:33 noida также используя длинный метод, будет кросс 64/32 бит, верно?

22:37 arai Это автоматически преобразуется в объект JavaScript Int64 на всех платформах, поскольку неизвестно, является ли это 32-битным или 64-битным значением. Это сделано ради совместимости.

22:37 arai https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/js-ctypes_reference/ctypes

person Noitidart    schedule 28.12.2014