Как работатет оператор Unsigned
- Войдите на сайт для отправки комментариев
Пт, 19/09/2014 - 01:00
Здравствуйте.
Подскажите, почему так:
unsigned char r = -249; void setup() { Serial.begin(9600); delay(5000); Serial.println("Starting..."); Serial.println(r); } void loop() {}
В итоге r=7... Хотя какзлось, что значение переменной r должно быть 249, т.е. просто отбрасывается знак минус...
unsigned
char только положительное
unsigned int тоже только положительные, а просто int любые
Здравствуйте.
Подскажите, почему так:
В итоге r=7... Хотя какзлось, что значение переменной r должно быть 249, т.е. просто отбрасывается знак минус...
Вы заблуждаетесь :) Намекаю: точка отсчета
unsigned - в переводе означает "беззнаковый". Следовательно, когда вы присваете переменной которая не умеет хранить знак числа, отрицательное число - вы говорите компилятору "догадайся сам что я хотел сказать".
Ну вот он и догадывается "как получится".
А "как получится" - зависит от того как числа хранятся в памяти.
В конечном итоге - все они хранятся в виде нулей и единиц.
А вот "что означают" эти нули и единицы - зависит именно от того как вы объвили переменную. Как будет интерпретироваться старший бит. Как "значащие значение" или как "знак числа". Это просто ваша договоренность с компилятором.
А ваше непонимание, скорее всего произошла от того, что вы сделали неверное предположение о том как выглядит отрицательные числа в двоичном виде. Сделайте
Serial.println(1,BIN);
Serial.println(-1,BIN);
и посмотрите что выведется. Скорее всего с "1" вы угадаете что увидите, а вот с -1 - вас ждет сюрприз. Будет совсем не то что "интуитивно предполагалось".
Дополнительный код (представление числа) — Википедия
Вообщем хранение в памяти чисел заточенно на то, что-бы их было удобно выполнять операцию сложения. В столбик. В двоичном виде.
leshak - спасибо за ответ!
ну помогай людям