| Автор |
Съобщение |
|
rumen
Ранг: Почетен член
Регистриран на: Чет Ное 25, 2004 3:42 pm Мнения: 913
|
декларираме променливи със знак на който си искаме компилатор и език
После в програмата на определен участък целта е да махнем знака
|
| Чет Апр 16, 2009 9:48 am |
|
 |
|
smtp
Ранг: Новодошъл
Регистриран на: Нед Яну 18, 2009 1:28 pm Мнения: 110
|
|
| Чет Апр 16, 2009 9:54 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
В зависимост от декларираният знак на числата компилаторът генерира различен обектен код. При командите за сравнение обикновено няма разлика, но в командите за условен преход след сравнението в различните случаи ( знак / без знак ) се проверяват различни флагове или комбинации от флагове. За по-подробно упътване виж какво буше в букварчетата по двоична аритметика.
|
| Чет Апр 16, 2009 9:57 am |
|
 |
|
rumen
Ранг: Почетен член
Регистриран на: Чет Ное 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 |
|
 |
|
rumen65
Ранг: Новодошъл
Регистриран на: Чет Окт 06, 2005 2:06 pm Мнения: 194 Местоположение: Sofia
|
Ако променливата трябва да се използва и със знак и без знак, в C се прави с кастване:
int a,b // те са със знак
if((unsigned int)a>(unsigned int)b) // проверката е без знак
Обикновено компилатора генерира предупреждение за това преобразуване. Не знам в протон как се пише това.
|
| Чет Апр 16, 2009 10:53 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Не знам какво е родила пикоборската ти глава но първото противоречие е защо след като нарастват над максималната стойност за signed integer /значи им се обръща и знака/ не си ги декларирал като unsigned ineger.
Той Протона е малоумна история за малоумници ама чак unsigned integer да не можеш да деклерираш не може да бъде.
|
| Чет Апр 16, 2009 11:39 am |
|
 |
|
rumen
Ранг: Почетен член
Регистриран на: Чет Ное 25, 2004 3:42 pm Мнения: 913
|
Все пак това ще е ключа за бараката.
Като не мога да си реша проблема из дъно ще го заобиколя със допълнителни променливи А1 и В1 които ще носят допълнителните характеристики за А и В.
Благодаря на всички отзовали се!
|
| Чет Апр 16, 2009 3:35 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Добре де, кажи какъв точно е проблема, че така и не разбрахме, пък ми стана интересно?
Толкоз години тропам по клавиатурата и нищо подобно не ме е мъчило....
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Чет Апр 16, 2009 3:39 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
|
| Чет Апр 16, 2009 4:12 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Гениалния протон няма ли unsigned ? 
|
| Чет Апр 16, 2009 5:08 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
 Re: деклариране на променливи
Прибавяш 32768 и си готов, поне на асемблер е така. Или може би търсиш модула на числото?
|
| Пет Апр 17, 2009 5:28 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Въобще неми стана ясно къв е проблема, ако не ти трябва знак, ги декларираш unsigned, ако пък ти трябва знак и превърта просто го декларирай като по голяма променлива, няма как да му обърнеш знака ако ти се налага да има и отрицателен знак щото няма как да знаеш наистина ли е отрицателно или е превъртяло, то не че няма как ама са някакви супер безсмислени упражнения.
|
| Пет Апр 17, 2009 7:23 pm |
|
 |
|
rumen
Ранг: Почетен член
Регистриран на: Чет Ное 25, 2004 3:42 pm Мнения: 913
|
 Отронвам този коментар заради Цецо и ToHu
Баш проблема се появява заради компенсиране недостига на периферия.
Примерно необходимоста от няколко таймера (двуцифрено число 32битови) удволетворявам с един таймер 16 битов + странни числа дето хем имат знак хем нямат.
П.П.
За съжаление това е максималното количество подробности.
Дано е достатъчно да не си губите съня 
|
| Пет Апр 17, 2009 9:47 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Колкото и да се опитваш да обясняваш че проблема е извън тъпоумната ти тиква ние си знаем че е там  :):)
Не очаквах че въпреки всичките обяснения няма да влезе нищо в нея.
|
| Пет Апр 17, 2009 10:12 pm |
|
|