Отговори на тема  [ 37 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
деклариране на променливи 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Чет Ное 25, 2004 3:42 pm
Мнения: 913
Мнение 
декларираме променливи със знак на който си искаме компилатор и език
После в програмата на определен участък целта е да махнем знака


Чет Апр 16, 2009 9:48 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Яну 18, 2009 1:28 pm
Мнения: 110
Мнение 
ДедоБоре написа:
за кой език+компилатор става въпрос?


http://www.picbasic.org/forum/showthread.php?t=11200&highlight=unsigned


Чет Апр 16, 2009 9:54 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
В зависимост от декларираният знак на числата компилаторът генерира различен обектен код. При командите за сравнение обикновено няма разлика, но в командите за условен преход след сравнението в различните случаи ( знак / без знак ) се проверяват различни флагове или комбинации от флагове. За по-подробно упътване виж какво буше в букварчетата по двоична аритметика.


Чет Апр 16, 2009 9:57 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Чет Ное 25, 2004 3:42 pm
Мнения: 913
Мнение 
Пише че старшия бит се взима за знак

Киров примера дето го дадох там за съжаление нищо не показва.
Не е компилатора крив.

Но проблема си остава.


Чет Апр 16, 2009 10:29 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Чакай бе човек.

Ето ти пример на C. На бейсик си нямам идея как е, ама не може да е по различно.

unsigned int a,b;

Оттука насетне a и b са ти две променливи които според размерността на int за конкретния случай ще заемат стойности от 0 до 65535 (за пик) или от 0 до 2^32 за 32 битов процесор.

Можеш да ги сравняваш колкото си искаш компилатора винаги ще гледа на тях като числа без знак.

Какъв е проблема?

Виж ако искаш да сравниш следното:

signed int a;
unsigned int b;

тогава е малко по друго. Ще трябва под някаква форма да извлечеш abs(a). Иначе компилатора няма как да ги сравни. Как ще извлечеш абсолютната стойност е тема на друг въпрос.

Ако си сигурен че а все още е положително, на C е лесно - if ( b > (unsigned int)a). Ако има възможност а да е станало отрицателно.... abs(a).

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Апр 16, 2009 10:49 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 06, 2005 2:06 pm
Мнения: 194
Местоположение: Sofia
Мнение 
rumen написа:
декларираме променливи със знак на който си искаме компилатор и език
После в програмата на определен участък целта е да махнем знака


Ако променливата трябва да се използва и със знак и без знак, в C се прави с кастване:

int a,b // те са със знак

if((unsigned int)a>(unsigned int)b) // проверката е без знак

Обикновено компилатора генерира предупреждение за това преобразуване. Не знам в протон как се пише това.


Чет Апр 16, 2009 10:53 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Не знам какво е родила пикоборската ти глава но първото противоречие е защо след като нарастват над максималната стойност за signed integer /значи им се обръща и знака/ не си ги декларирал като unsigned ineger.
Той Протона е малоумна история за малоумници ама чак unsigned integer да не можеш да деклерираш не може да бъде.


Чет Апр 16, 2009 11:39 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Чет Ное 25, 2004 3:42 pm
Мнения: 913
Мнение 
bateAz написа:
В зависимост от декларираният знак на числата компилаторът генерира различен обектен код. При командите за сравнение обикновено няма разлика, но в командите за условен преход след сравнението в различните случаи ( знак / без знак ) се проверяват различни флагове или комбинации от флагове. За по-подробно упътване виж какво буше в букварчетата по двоична аритметика.


Все пак това ще е ключа за бараката.
Като не мога да си реша проблема из дъно ще го заобиколя със допълнителни променливи А1 и В1 които ще носят допълнителните характеристики за А и В.
Благодаря на всички отзовали се!


Чет Апр 16, 2009 3:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Добре де, кажи какъв точно е проблема, че така и не разбрахме, пък ми стана интересно?

Толкоз години тропам по клавиатурата и нищо подобно не ме е мъчило....

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Апр 16, 2009 3:39 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
http://en.wikipedia.org/wiki/Two%27s_complement


Чет Апр 16, 2009 4:12 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Гениалния протон няма ли unsigned ? :D


Чет Апр 16, 2009 5:08 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение Re: деклариране на променливи
rumen написа:
декларираната променлива може да заема стойностите от -32768 до + 32768
на мен ми трябва от 0 до 65535
Как се прави врътката в такива случаи?

Прибавяш 32768 и си готов, поне на асемблер е така. Или може би търсиш модула на числото?


Пет Апр 17, 2009 5:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Въобще неми стана ясно къв е проблема, ако не ти трябва знак, ги декларираш unsigned, ако пък ти трябва знак и превърта просто го декларирай като по голяма променлива, няма как да му обърнеш знака ако ти се налага да има и отрицателен знак щото няма как да знаеш наистина ли е отрицателно или е превъртяло, то не че няма как ама са някакви супер безсмислени упражнения.


Пет Апр 17, 2009 7:23 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Чет Ное 25, 2004 3:42 pm
Мнения: 913
Мнение Отронвам този коментар заради Цецо и ToHu
Баш проблема се появява заради компенсиране недостига на периферия.
Примерно необходимоста от няколко таймера (двуцифрено число 32битови) удволетворявам с един таймер 16 битов + странни числа дето хем имат знак хем нямат.

П.П.
За съжаление това е максималното количество подробности.
Дано е достатъчно да не си губите съня :D


Пет Апр 17, 2009 9:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Колкото и да се опитваш да обясняваш че проблема е извън тъпоумната ти тиква ние си знаем че е там :):):)
Не очаквах че въпреки всичките обяснения няма да влезе нищо в нея.


Пет Апр 17, 2009 10:12 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 37 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни