Как работатет оператор Unsigned

rfl
Offline
Зарегистрирован: 21.10.2013

Здравствуйте.

Подскажите, почему так:

unsigned char r = -249;
 
void setup() {
   Serial.begin(9600);
   delay(5000); 
   Serial.println("Starting...");
   Serial.println(r);
}

void loop() {}

В итоге r=7... Хотя какзлось, что значение переменной r должно быть 249, т.е. просто отбрасывается знак минус...

 

vvadim
Offline
Зарегистрирован: 23.05.2012

unsigned char  только положительное

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

unsigned int тоже только положительные, а просто int любые

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

rfl пишет:

Здравствуйте.

Подскажите, почему так:

unsigned char r = -249;
 
void setup() {
   Serial.begin(9600);
   delay(5000); 
   Serial.println("Starting...");
   Serial.println(r);
}

void loop() {}

В итоге r=7... Хотя какзлось, что значение переменной r должно быть 249, т.е. просто отбрасывается знак минус...

Вы заблуждаетесь :) Намекаю: точка отсчета

leshak
Offline
Зарегистрирован: 29.09.2011

unsigned - в переводе означает "беззнаковый". Следовательно, когда вы присваете переменной которая не умеет хранить знак числа, отрицательное число - вы говорите компилятору "догадайся сам что я хотел сказать".
Ну вот он и догадывается "как получится".
А "как получится" - зависит от того как числа хранятся в памяти.
В конечном итоге - все они хранятся в виде нулей и единиц.
А вот "что означают" эти нули и единицы - зависит именно от того как вы объвили переменную.  Как будет интерпретироваться старший бит. Как "значащие значение" или как "знак числа". Это просто ваша договоренность с компилятором.

А ваше непонимание, скорее всего произошла от того, что вы сделали неверное предположение о том как выглядит отрицательные числа  в двоичном виде.  Сделайте
Serial.println(1,BIN);

Serial.println(-1,BIN); 
и посмотрите что выведется. Скорее всего с "1" вы угадаете что увидите, а вот с -1 - вас ждет сюрприз. Будет совсем не то что "интуитивно предполагалось".

Дополнительный код (представление числа) — Википедия

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

rfl
Offline
Зарегистрирован: 21.10.2013

leshak - спасибо за ответ!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну помогай людям