2016-05-18 4 views
0

Я хотел бы сохранить подписанный int32 в неподписанном uint32, чтобы я мог извлечь из него int32. Значение самого uint32 не используется, когда оно хранит целое число, подобное этому, но я не могу использовать объединение в этом случае, к сожалению. Так я в настоящее время сделать это, просто превращая его:Подписанное целое число без знака и обратно?

int32 signedVar = -500; 
uint32 unsignedVar = uint32(signedVar); 
func(int32(unsignedVar)); // should supply the function with -500 

Это, кажется, работает, но я боюсь, что это не может быть переносным, и что может быть излишние переходы происходят за кулисами за то, что я В надежде, что нет-op.

Is -500 или любое другое отрицательное количество гарантировано, чтобы выжить в этом конверсии? Если нет, есть ли «безболезненный» (ни один из типов не изменен, а только метод конверсии)?

Edit: Я больше всего обеспокоен убедившись, что значение в int32 сохраняется в uint32 поэтому он может быть использован в качестве int32 одного и того же значения позже, версия uint32 никогда не используется. (редактирование, потому что SO попросил меня объяснить, как это не дублирует другой вопрос, в нем не указывается, какими должны быть результаты преобразования, или что он должен быть симметричным, как это, делая его слишком общим, чтобы быть применяемый здесь)

+1

Зачем вам нужно туда и обратно? – NathanOliver

+2

использовать reinterpret_cast? –

+0

@NathanOliver - tbh, лень. Есть крайний случай, когда в массив может быть отрицательный индекс, и я не хочу писать машинное оборудование в конвейер, чтобы справиться с ним. –

ответ

1

Если ваша машина использует арифметику 1s-дополнение или знак-значение (что, по крайней мере, допускается по стандарту C, не уверен в C++), то это двойное преобразование преобразует значение -0 в 0. Если ваша машина использует дополнение 2s, тогда это будет хорошо.

Это говорит о том, что я не знаю ни одной машины, построенной за последние 30 лет, которая использует что-либо, кроме дополнения 2s для арифметики.

Смежные вопросы