Разрешить переполнение сложения в vb.net

Я работаю над приложением vb.net, которому нужно сложить несколько целых чисел. Целые числа должны быть без знака и иметь длину 32 бита.

Ожидается, что целые числа будут настолько большими, что они переполнятся при сложении. Если происходит какое-либо переполнение, я не хочу сохранять какое-либо переполнение или возникать какие-либо исключения.

Например, если бы я работал с 4-битными числами, мне бы хотелось следующее поведение:

1111 + 0010 = 0001

Я пробовал следующее, чтобы увидеть, что происходит при переполнении - я получаю исключение переполнения. Есть ли какой-нибудь элегантный способ обойти это?

Dim test As UInt32 = UInt32.MaxValue

Console.WriteLine(test.ToString())

test = test + 1

Console.WriteLine(test.ToString())

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

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

Я вижу очевидное решение преобразования между UInt64 и UInt32, однако мне, возможно, придется расширить приложение в будущем, чтобы использовать 64-битные числа (поэтому было бы неплохо иметь решение, которое легко расширяется)

Заранее спасибо,

Дэйв


person stormCloud    schedule 16.03.2014    source источник


Ответы (2)


Вы можете использовать параметр «Удалить проверку целочисленного переполнения» в «Проект» -> «‹имя проекта> Свойства…» -> вкладка «Компиляция» -> «Дополнительные параметры компиляции...»

Dim a As UInt32 = UInt32.MaxValue
a += 1
Console.WriteLine(a) ' outputs 0
person Andrew Morton    schedule 16.03.2014
comment
Это именно то, что я хотел. Большое спасибо. - person stormCloud; 17.03.2014

Вам придется использовать 64-битные целые числа (в вашей версии VB они могут называться Longs).

Dim Value1 As Long = 12345
Dim Value2 As Long = 67890
Dim Result As Long = Value1 + Value2

' Remove the overflow from the result
Console.WriteLine(Result AND &HFFFF)

Вы можете использовать целые числа со знаком или без знака, но вам придется удвоить объем памяти, чтобы заставить его работать (например, от 16 до 32).

person Adam Zuckerman    schedule 16.03.2014
comment
Я думал о чем-то подобном, но возникла бы проблема, если бы я захотел использовать 64-битные числа в будущем с переполнением, и мне пришлось бы делать циклические сдвиги и т. д. с этими числами, так что это может вызвать головная боль... Спасибо за предложение. - person stormCloud; 17.03.2014
comment
Вы также можете пометить отдельные значения с помощью &H7FFF. Это предотвратит возможность переполнения. И вам не придется отключать проверку переполнения. - person Adam Zuckerman; 17.03.2014