Преобразование VB6 Varables в C # - PullRequest
2 голосов
/ 31 мая 2019

Я конвертирую старый код VB6 и у меня проблема с этими константами:

Код VB6:

Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000

C # код:

private const int GENERIC_WRITE = 0x40000000;
private const uint GENERIC_READ = 0x80000000;

Почему вторая строка должна быть uint? Если я сделаю это как int, это выдаст мне ошибку?

Ответы [ 3 ]

3 голосов
/ 31 мая 2019

Правильный перевод C #:

const int GENERIC_READ = unchecked((int)0x80000000);

В VB GENERIC_READ неявно является целым числом с отрицательным значением. Единственный способ воспроизвести это в C # - привести целочисленный литерал без знака к int в непроверенном контексте.

Источником путаницы является историческая разница между VB и C # в отношении шестнадцатеричных литералов: 0x80000000 == 2147483648 в C #, но не в VB.NET

В отсутствие суффикса типа в литерале шестнадцатеричные литералы в VB.NET имеют тип Integer или Long, а не тип без знака.

2 голосов
/ 31 мая 2019

Максимальное значение Int32 равно 2 147 483 647, а значение 0x80000000 равно 2 147 483 648 или Int32.MaxValue + 1.

Использование uint (или long) дает вам тип, достаточно большой, чтобы вместить значение, которое вы присваиваете.

0 голосов
/ 31 мая 2019

Примитивные типы данных с префиксом "u" являются беззнаковыми версиями с одинаковыми размерами битов.Фактически это означает, что они не могут хранить отрицательные числа, но, с другой стороны, они могут хранить положительные числа в два раза больше, чем их подписанные аналоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...