Трябва ли да неподписани числа
Плурализмът в една глава - е шизофрения.
Наум Korzhavin
Без неподписани числа, по принцип е възможно да се управлява. В действителност, ако изведнъж се наложи да се използва номер по-голям от 2147483647 (това е максимумът за 32-битово цяло число, максималните 32-битови цели числа без знак - е 4294967295), вие трябва просто да отида за числа от 64-битови. Заедно този път отидох на езика Java. В него не е положително цяло. Ние живеем в един перфектен свят, които биха били създадени точно според нашите вкусове, неподписани числа следва да бъдат изключени от езика на нашите мечти. Но ние трябва да се примири със съществуващия околната среда, която често е представена на Windows. А пълно използване WinAPI неподписани числа. Ако искаме пълното съдействие на нашите програми с Windows, не можете да отхвърлите неподписани числа.
Какъв е максималният размер на файла, който може да работи с вашата програма? Опитайте се да разберете. 32-битовите версии на Windows работата подкрепа с файлове дължина 4Gb. Убедени в това, като прочетете описанието на функциите WinAPI ReadFile: Но помисли за функцията за позициониране (Borland C ++ 5.5) Файл: Както можете да видите, неподписани числа в определянето на тези функции не се използват. Само подписан числа. Ето защо, Borland C ++ 5.5 просто не ни позволява да се работи с файлове по-дълъг от 2 GB! Или трябва да имаш uzhatsya в желанията си?
Ограничаване на размера на файла 2Gb - не най-неотложния проблем. Особено в периода на преход към 64-битова. Въпреки това, необходимостта от взаимодействие с WinAPI сили имат езикови неподписани числа.
Символни кодове - неподписани числа или подписани?
Вероятно няма такава програмист, който би никога през живота си не се хареса на таблицата със символи. Да кажем, че ни отне, за да разберете кода, например, буквата "I" в 1251. Това писмо е кода страница 255. писане на код в програмата: Писано е: Какво, по дяволите? Както може да има отрицателно код символ? символната таблица няма отрицателно код! Уви, на негативните кодове характер - горчивата истина. C'est е животът. Тя ще изглежда, не се притеснявайте, ще трябва да си спомняме за тази проста. Но да речем, че имате тази възможност, където всяка буква съответства на определено цяло. Уви, не можете. Тъй като "Аз" е с код на -1, а след това ще се хареса на елемента на масива с индекс 1. Това не е проблем за езици като PHP. Но какво да се прави в езици като C / C ++. Не, ние все още не искал да работи с отрицателни индекси на масив. И тъй като preodelet? Може да приеме един трик: Но като цяло, компилаторът не може да гарантира, че масите «ar0» и «Аг 1» ще бъде поставен в съседни населени места на паметта. C / C ++ стандарт (наистина, всеки друг език!) Не гарантира поставянето на съседните променливи в същия квартал и в паметта. И защо е така, не разполагат с нормални решения? Опитайте се да обикалят. Оказва се: идиотизма! Какво блестящ човек прави негативни кодове? Може би това е всичко, защото Stroustrup? В действителност, в чисти константи С характер като "I" има Int и С ++ - тип овъгляване. Променливи и константи от тип знак не могат да имат стойности по-големи от 127. Но, ако те са от тип Int г. INT може да позволи на стойности по-големи от 127! Консултирайте се с чист компилатор - TinyCC. Получаваме: Така че, Stroustrup има извинение: С в същата каша. Обвинението, Ричи. Тук е доброволно да се предаде и изповед (Kernighan, Ричи, «С език за програмиране", второ издание):
Дали променливи от тип Чар икона (подпис) или грозен, в зависимост от конкретната система, но на екрана и печатни знаци са винаги положителни кодове.
Това е всичко. С други думи, вие искате да - се придържаме към правилата pravostronnego движение. И можете да - дясна ръка, всичко зависи от конкретната страна.
Е, ние имаме нещо общо когато няма де юре стандарти, но има и фактически стандарти? Ние се опитваме да се конкурират по-: Пфу, най-накрая! Но колко внимателно се разпръснаха гребла! В крайна сметка, ако ние не направим наистина като че символни кодове са отрицателни, както и референтни таблици, написани нещо съвсем различно, ние можем просто да пренапише таблицата. Сега можете да диша спокойно? Не, чакай. Разбира се, че не! Първият достъпен под ръка урока на сайта С нас, която разказва. символни кодове варират 0-255! Как така? Ние току-що видяхме, че героите се съхраняват в променливи на Чар, които имат обхват от -128 до 127! Нека да видим показва на символите на екрана в кодирането 866: ще се появи на конзолата: Какво имаме? String константи се състоят от елементи от тип Чар (диапазон от стойности - от -128 до 127), но в тези редове, ние трябва да напише данните 0-255? Точно така! Езикът на C не дава отрицателен принос код вътре низови константи!
И това не е всичко. Когато сортиране струни трябва да използвате или тяхната собствена функция за сравнение (които се вземат под внимание, че "аз" все още по-голямо "Z"), или смята да се сортират струни като грозен Чар.
Какво може да се направи извод от нашите разследвания? Възможно ли е да се направи кодовете на символите ще бъдат положителни? В действителност има езици, в които няма такива проблеми. Основните защото всичко е наред!
Изходи вижда като (в зависимост от типизирането).- Статично въвели, неподписани числа в езика не съществуват. В този случай, вие ще трябва да плати нещо. За да съхранявате се изисква 8-битов характер в този случай в теорията на 9 бита, но на практика 16. UNICODE символи на 16-битови ще се съхранява в 32 бита. Голям ако тази цена - това е до създателите на бъдещите езици.
- Статично написали, неподписани числа на езика там. Тогава символичните константи могат да бъдат доста грозен Чар! Това е един от "за" аргумент в правото оспорва съществуването на неподписани числа.
- Dynamic пишете. В такъв език го няма значение какъв вид на една или друга стойност. Ако програмата е написана, «а =" I ";", а след това променливата «а» ще има тип низ и стойността ще бъде, това е "аз". И ако трябва да знаете кода за този герой? Така че за това в такива езици съществува функция Вал (), която връща кода характер. И когато пишете функции в нашите ръце: Искам - и всички кодове ще бъдат положителни, искам да - точно обратното. В този случай, допълнителните "технически подробности" са просто скрити и не видими за програмиста.
Сравнението на подписани и неподписани числа
Ако дадете правото на живот е положително цяло, а след това трябва да сме подготвени за други трикове. Например това: Въпреки факта, че 1 = 0 "винаги е вярно, както и цикъл не се прекъсва, както се очаква, и да продължи нататък. И, следователно, настъпва един безкраен цикъл, в който «аз» се променя стойността си от 4294967295 до 0. Причината - неправилно сравнението на неподписан и подписан цяло число при проверка на състоянието на продължаване на цикъла. Това е, което ние разгледахме в предходния параграф.
Поведение на преливане
Описаните по-горе проблеми, свързани с неправилно поведение програма в случай на преливане. Препълване на хардуерно ниво, че е възможно да се проследи. компютърен софтуер Архитектура IBM / 360/370 ЕС preusmativalos прекъсне за преливане. Структурата x86 е специален случай флаг. където CF и флагове сигнал за настъпили преливане в аритметични операции. Тя ще изглежда, нищо не пречи да реагира на тях. Но в C / C ++ това не стане, причината е най-вероятно neobhomost преносимост на различни платформи. В крайна сметка, този език трябва да се държи по същия начин, по стотици платформи, включително компютри на 1970-те години: PDP, DEC, ICL. С език произхожда от началото на 1970 г. и да се държат по същия начин, както преди 40 години. Затова съвременните компилатори игнорират реакцията на хардуерните възможности за преливане.
И тук е езикът, Ruby, без да има зад наследство код на Стария Завет, не могат да си позволят да работят правилно. В Ruby на "разширяване" има преливане на клетките за съхранение на стойността на променливата, така че да се настанят без загуби нова стойност. Т.е. "В движение" се променя битови компютри. Ето защо Ruby не се провали на теста за изчисляване на факториел. Повечето езици имат "паузи" по време на 12! или 13! Те включват Паскал. който се похвали със своята "радикално математически."
Заключения относно използването на неподписани числа.
Те са по-полезни за статично въвели езици. Ето кои са те:- На езика на бъдещето още по-добре да има неподписани числа.
- Трябва да генерира преливни изключения. Програмата не трябва да се приема мълчаливо такива грешки. Грешките не трябва да се смълчани!
- При възлагане на числа неправилни стойности трябва да бъдат генерирани изключение.
- Необходимо е да се направи валидно сравнение на подписаните числа и без. В сравнение неподписан междинно съединение А и междинно съединение В, тогава
- Ако А-маловажния бит е 1 (т.е.> 2147483647), А> B
- Ако В MSB е 1 (т.е., В е отрицателна), след това A> B
- В противен случай най-значимите бита на двете числа са равни на 0 и сравнение резултат A> B ще бъде вярна.
Допълнителна информация по тази тема
# 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; # 9608; 3 (33.3%)
В езика за програмиране схема реализира такъв номер на модел, който отговаря най-съвременните математически понятия. Всяко число има комплекс. Въпреки това, той има и други състояния. За пример - е 3, а цялото число и реалния брой и комплексно число и +3. Нека просто кажем, всички числа са реално език. Всички реални числа са комплексни. Въпреки, че се използват вътрешния представяне на различни формати, този модел е напълно прозрачен за програмист - различни номера могат да участват в експресионен без изрично превръщане. Изключения могат да бъдат само цели числа - в редица изпълнение те са дълги и може да съдържа произволен брой цифри. Това по време на операции, в резултат на което не е определено число може да доведе до препълване Задължения за проследяване на тази ситуация лежат на програмист.
"Variable« UI »се третира като целочислени Да, и след това да устрои засада Но се избегне -. Съвсем възможно задача."
Напротив той е "аз" се третира като цяло число без знак.
Да, прав сте, сега съм вярна
Уви, не можете. Тъй като "Аз" е с код на -1, а след това ще се хареса на елемента на масива с индекс 1. Това не е проблем за езици като PHP. Но какво да се прави в езици като C / C ++?
овъгляване и [256]; харак * S1 = (S [127]); // и индекси в двете страни върху здравето
Идиотизма! Какво блестящ човек прави негативни кодове?
Брад, не разбирам какъв е проблемът, подписано Чар - ще е отрицателно, грозен Чар - ще не. И няма ли някакво значение кой път нещо?
А по въпроса за преливане.
ССЗ:
6.53 вградени функции за извършване на аритметика с Overflow Проверка
Следващите вградени функции позволяват извършване на прости аритметични операции, заедно с проверка на това дали операциите преляха.
- Вградена функция: булев __builtin_add_overflow (type1 един, тип2 б, Type3 * ВЕИ)
- Вградена функция: булев __builtin_sadd_overflow (INT а, вътр б, Int * ВЕИ)
- Вградена функция: булев __builtin_saddl_overflow (дълго Int един, дълго вътр б, дълги INT * ВЕИ)
.
И това:
Звън предоставя следните проверени аритметични всички команди:
BOOL __builtin_add_overflow (TYPE1 х, у тип 2, Type3 * сума);
BOOL __builtin_sub_overflow (TYPE1 х, у тип 2, Type3 * разл);
BOOL __builtin_mul_overflow (TYPE1 х, у тип 2, Type3 * про);
.