Взаимодействие с #, используя "long" из c ++ - PullRequest
2 голосов
/ 10 мая 2010

В моей системе: sizeof (long) в c ++ составляет 4 или 32 бита sizeof (long) в c # равен 8 или 64 битам

Таким образом, в моих объявлениях методов Interop я заменял длинные значения c ++ на c # int, однако я чувствую, что это не безопасно?

Почему long имеет такой же размер, как int в c ++? И долго это 64 бита? Что дальше долго долго долго долго ??

Ответы [ 3 ]

7 голосов
/ 10 мая 2010

Лучше всего, если у вас есть последняя библиотека C, - include <stdint.h> и использовать uint64_t, int64_t, uint32_t, int32_t. Это будет работать независимо от модели базовой платформы.

Но если вам любопытно, основная проблема заключается в том, что разные системы используют разные модели. В 32-битных системах и Posix, и Windows используют ILP32, что означает, что целое число, long и точка имеют длину 32 бита.

Для 64 битов Posix и Windows используют разные модели.

Posix обычно использует LP64, что означает 32-битные целые, 64-битные и 64-битные указатели.

Windows использует LLP64, что означает 32-битные целые и длинные, 64-битные длинные и 64-битные указатели.

0 голосов
/ 10 мая 2010

На большинстве платформ C ++ long совпадает с int и составляет 4 байта. Это был остаток 16-битных дней, когда int было 2 байта, а long было двойным словом - то есть 4 байта.

Так что, если ваша платформа C ++ использует 32-битную длину, преобразование их в C # int вполне безопасно.

0 голосов
/ 10 мая 2010

Да, это безопасно, если они не являются целыми числами размера платформы (например, 32-разрядными для платформы x86 и 64-разрядными для платформ x64), в этом случае вы должны использовать IntPtr.

Не забывайте, что на момент определения C (++) размер вычислений по умолчанию не составлял 32 бита. Таким образом, 32 бита были определены как «длинные». Однако более новые языки программирования приняли новые размеры по умолчанию.

...