Что должно произойти с отрицанием size_t (т.е. '-sizeof (нечто структуры)'))?

Используйте services.msc, или (Запустите> Панель управления> Средства администрирования> Сервисы) найти рассматриваемый сервис. Дважды щелкните для наблюдения сервисного названия и пути к исполняемому файлу.

Проверка exe информация о версии для подсказки относительно владельца службы и использования Добавляет/Удаляет программы, чтобы сделать чистое удаление, если это возможно.

Сбой, что, от командной строки:

sc stop servicexyz
sc delete servicexyz

Никакой перезапуск не должен требоваться.

12
задан Phil Miller 12 August 2009 в 22:31
поделиться

5 ответов

Стандарты ISO C и ISO C ++ гарантируют, что беззнаковая арифметика выполняется по модулю 2 n - т. Е. Для любого переполнения или потери значимости она «оборачивается». Для ISO C ++ это 3.9.1 [basic.fundamental] / 4:

Целые числа без знака, объявленные unsigned , должны подчиняться законам арифметики по модулю 2 n , где ] n - это количество битов в представлении значения этого конкретного размера целого числа. 41

...

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

Для ISO C (99) это 6.2.5 / 9:

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

Это означает, что результат гарантированно будет таким же, как SIZE_MAX - (sizeof (struct foo)) + 1 . . 12128] В ISO 14882: 2003 5.3.1.7:

[...] Отрицательное значение беззнакового количество вычисляется путем вычитания его значение от 2 n , где n - количество бит в продвигаемый операнд. Тип результат - это тип продвигаемого операнд.

21
ответ дан 2 December 2019 в 05:28
поделиться

http://msdn.microsoft.com/en-us/library/wxxx8d2t%28VS.80%29.aspx

Унарное отрицание беззнаковых величин выполняется путем вычитания значения операнда из 2 n , где n - количество бит в объекте данный беззнаковый тип. (Microsoft C ++ работает на процессорах, использующих арифметика с дополнением до двух. На других процессоры, алгоритм отрицания могут отличаться.)

Другими словами, точное поведение будет зависеть от архитектуры. На вашем месте я бы не использовал такую ​​странную конструкцию.

2
ответ дан 2 December 2019 в 05:28
поделиться

Единственное, о чем я могу думать, это настолько неправильно, что у меня болит голова ...

size_t size_of_stuff = sizeof(stuff);

if(I want to subtract the size)
    size_of_stuff = -sizeof(stuff);

size_t total_size = size_of_stuff + other_sizes;

Переполнение - это особенность!

1
ответ дан 2 December 2019 в 05:28
поделиться

Из текущего проекта стандарта C ++ , раздел 5.3.1, предложение 8:

Операнд унарного оператора - должен иметь арифметические или тип перечисления, и результатом является отрицание его операнда. Целостное продвижение выполняется для целых или перечислимых операндов. Отрицательное значение беззнаковой величины вычисляется путем вычитания ее значения из 2 n , где n - количество битов в продвинутом операнде. Тип результата - это тип продвинутого операнда.

Таким образом, результирующее выражение все еще беззнаковое и вычисляется, как описано.

Пользователь @out упомянул об этом в комментарии, но я собираюсь поместить его в ответ, так как outis не сделал. Если Аутис вернется и ответит, я приму это вместо этого.

1
ответ дан 2 December 2019 в 05:28
поделиться

отрицание числа без знака полезно для распространения lsb по слову, чтобы сформировать маску для последующих побитовых операций.

2
ответ дан 2 December 2019 в 05:28
поделиться