Почему в intsafe.h Win32api код беззнакового представления абсолютного значения целого числа такой странный?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему в intsafe.h Win32api код беззнакового представления абсолютного значения целого числа такой странный?

Сообщение Anonymous »


Я не знаком с c/c++, но знаю, что этот код принимает беззнаковое абсолютное значение. Странно, почему программист Microsoft должен сначала получить +1 к целому числу, затем его отрицательное значение, а затем +1. Почему нельзя просто использовать его, а затем преобразовать в целое число без знака?

===============

Хорошо, теперь я понимаю, что основная причина заключается в том, что многие варианты поведения в стандарте C/C++ не определены. Стандартизированная библиотека не должна затрагивать какие-либо неопределенные варианты поведения, даже если в определенных реализациях она имеет определенное поведение. Я также узнал, что некоторые компиляторы пытаются оптимизировать это неопределенное поведение, делая его действительно непредсказуемым. Это отличается от многих новых языков, которые в основном реализованы официально.

===============

//intsafe.h если (llMultiplican < 0) { // // Избегайте отрицания самого отрицательного числа. // ullMultiplicand = ((ULONGLONG)(- (llMultiplicand + 1))) + 1; } еще { ullMultiplicand = (ULONGLONG)llMultiplicand; } Например, для целого числа, состоящего всего из 4 бит, минимальное значение равно -8, что в двоичном формате равно «1000». Я знаю, что отрицательное число по-прежнему равно 1000, но если в этот момент его преобразовать в беззнаковое целое число, его беззнаковое абсолютное значение уже можно получить.

Я думал, что это может быть проблема с производительностью, но после нескольких запусков непосредственно на языке C мне было трудно увидеть разницу. И странно, что положение функции в коде будет влиять на общее время. Например, сначала напишите объявление и реализацию функции abs1 над функцией abs2 или наоборот. Место вызова то же самое, но результаты разные. Я не могу понять
unsigned int abs1(int x) { если (х
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»