Те, кто использует такой язык, как VB, у которого нет действительно удобного способа отключения проверки переполнения во время преобразования, могут использовать что-то вроде:
Shared Function unsToSign64(ByVal val As UInt64) As Int64
If (val And &H8000000000000000UL) 0 Then Return CLng(val Xor &H8000000000000000UL) Xor &H8000000000000000 Else Return CLng(val)
End Function
Shared Function signToUns64(ByVal val As Int64) As UInt64
If val < 0 Then Return CULng(val Xor &H8000000000000000) Xor &H8000000000000000UL Else Return CULng(val)
End Function
или
Shared Function unsToSign(ByVal val As UInt64) As Int64
Return CLng(val And &H7FFFFFFFFFFFFFFFUL) + (CLng(-((val And &H8000000000000000UL) >> 1)) << 1)
End Function
Shared Function signToUns(ByVal val As Int64) As UInt64
Return CULng(val And &H7FFFFFFFFFFFFFFF) + (CULng(-((val And &H8000000000000000) >> 1)) << 1)
End Function
Версии для 32 бит будут очень похожи.Я не уверен, какой подход будет быстрее.Изменения немного глупы, но они избегают необходимости тестов «если».