2015-04-23 4 views
1

Мне нужен целочисленный 16-разрядный целое значение без знака на моем OPC-сервере, но он может отправлять только подписанное 16-битное целое число. Мне нужно сменить это знаковое целое на unsigned математически, но я не уверен, как это сделать. Мои интернет-исследования не привели меня на правильный путь. Может кто-нибудь, пожалуйста, дайте совет? Заранее спасибо.Преобразовать подписанное целое число без знака математически

+0

Какой язык программирования вы используете, чтобы написать этот код? – StilesCrisis

ответ

1

Математически преобразование из подписанного в неподписанное работает путем отправки неотрицательного остатка знакового целого, деленного на 1 + max, где max - максимальное целое число, которое вы можете записать с доступным количеством бит, 16 в вашем случае.

Эта логика работает следующим образом для целого числа s:

if s >= 0 then return s else return 1 + max + s 

За это соглашение, чтобы работать, как ожидается, подписанная s должны удовлетворять

- (1 + max)/2 <= s < (1 + max)/2 

В вашем случае, учитывая, что у вас есть 16 бит, мы имеем max = 0xFFFF и 1 + max = 0x10000 = 65536.

Обратите также внимание, что если вы кодифицируете отрицательный интеграл ger с этим соглашением, результат будет иметь свой старший бит, т. е. равный 1. Таким образом, старший бит становится флагом, который сообщает, является ли число отрицательным или положительным.

Примеры:

2 -> 2 
1 -> 1 
0 -> 0 
-1 -> 0xFFFF 
-2 -> 0xFFFE 
-3 -> 0xFFFD 
... 
-15 -> 0xFFF1 
... 
-32768 -> 0x8000 = 32768 (!) 
-32769 -> error: cannot codify using only 16 bits.