Искусство программирования на Си (984073), страница 73
Текст из файла (страница 73)
Хппссиоп( 5115=1 201 >Хп */ рг1пст(" <ВН><ВН>)п"); Хгее(оору01япегу5сгьп9); рг1пят(" <1НРОТ ТХРЕ=Х ЯнЬв(11 >Хп'); 11(ИОЬЬ == ЬХЯС) ргьпят(" </СЕВТЕН>(п'); ( рг)пят( </РОНЕ>(п ); рг1пст("Сап'С рагве СО1 дата.ап"); ) геспгп ЕХ1Т РАХЬОНЕ/ рг1пст(" </ВООХ>)в )> рггпст("</ВтНЬ>1п"); /****а«**а*а«а*««*а****«*а** ) а * Щ$ мгн«а«литании тем « .
Згн Налигание Сбйлргниннге««и«З на Г «та«лите«ение темитинегнне раздели 1 — Глава 23 йц:~ айнем сит от вашей реализации, но вполне возможно, чзо по- Рассматривайте все так, как если бы это был откры- лучат. Это и является одной из возможностей взлома, тый код. Лкзбой вызов системного приложения необховремсни — вполне обычное дело, и для получения даты на которую следует обратить внимание в первую оче- димо проверять, чтобы убедиться, что он нс несет пои времени можно пользоваться нс только функциями рсдь. тснциальной опасности.
Нс думайтс, что ваш кол гппео и 1оса111шео, но и вувгегпо. А некоторые СО1- Как же можно обеспечить безопасность СО)-прило- является секретом только потому, что его будет видеть аьа «1 про~риммы лля отправки своих выходных данных по жений? только персонал вашей компании. Внутренние взлом- электронной почте вызывают функцию вепйшая. И если На самом дслс все довольно просто. Всегда считай- шики — вполне обычное дело в компьютерном бизневузгеш() используется непродуманно, то именно в таком те, что каждый блок данных содержит ошибки или даже се. Сможет ли ваша компания выдержать направленную является атакой на ваш сервер. Поэтому всегда все про- атаку взломшика, вооруженного внутренними данными, веряйте.
полученными от обиженного (или бывшего) работника Исходный НТМЕ-код не является секретом Не используйте метод ОЕТ лля отправки данных на вашей компании. сервер, пока нс будете вполне убеждены в том, что пс- Давайте будем осторожными. Почти любой браузср позволяет пользователю просмотреть наш НТ(нн -кол и/или сохранить его в файле.
Эта Помните, что вся строка запроса ( 11'Ейе' ЯТВВнб бу- рЯЗЯЦЕ инфориация может быть полезна лля взлонппика в его дет выводится в адресной ()В -строке браузера клиенпопытках на шить наш та, и сели подглялывание через плечо може~ принести В этой главе рассмотрено программирование в среде вред вашему СС«1-приложснггю, то лля отправки данных единого шлюзового интерфейса (СО1). Детально описан используйте метод РОЯТ. процесс создания линалгических нтсЬ-страниц с исполь,Зц Ы Е Киа Ы - , . <1НРПТ ТХРЕ=НГВОЕН МЛЗШтВВЛЕГЕО Всегда следитс за тем, какие данные раскрываетс в зованием стандартных языков программирования Арифиетинсс ероизоии,нои о очности Вассой) Глава 24 $ЛИ Ариф(иетика произвольной ТОЧНОСТИ Листинг 24.1.
Вычисление значения числа е почти правла, но нс совссм, поскольку, например, прн сложснии очень больших чисел получаемый результат !гвс1вде <вьдго Ь> гвг ва(в(1аг агвс, сваг * вгчч[)) ( доиЫе дкевв10; довЫе дяог)с; 1вс нс может быть представлен типом!п( пли )опя (п(. А лля нспслыл чиссл это совсем неправда, поскольку сушс- зги Ке ии гегвгв 0 ствуст ограниченно на точность прслставлсния в ком- В ЭТОЙ ГЛАВЕ пьютсрс чиссч с плавакзшсй точлои Поэгомт посзсдннс несколько битов результата можно поставить под содлев 010 = 1. 0; мнснис.
° Распространение ошибок при выполнении арифметических операций двогх = 1.0; Но сколько битов являются сомнительными? Если ° Пс сполнснис, р о. нс ис, потеря значимости и деление на нуль у вас есть два числа А и В н вы хотите получить значс° Порядок выполнения операций 1ог (1=1 П 1<20!(1++! ннс А ч В, то нсобхолимо имсть ввиду, что число А в ( ° Размеры цсльгх чисел двог)о Ги компьютере представляется в виде А 2 а, глс о — овиб- ддввв1г += двогК; ка числа А, а В прслставлястся в виде В+ Ь, гдс 0— е Размеры чисел с плаваюшсй точкой ) осиибга числа В. В результате сложения получается рс° Никогда нс делайте предположений относительно срспы выполнения кода рг1вве( е = всув",длевв10); зультат А + В Е Го ч бд слсдоватсльно, прн сложении ° Примеры высокой и низкой точности ошибки складываются.
Ошибки могут быть как есоиожительиьсмсс, зак и от° Разлнчныс методы представления сверхвысокой точности рияасоелоимми. Поскольку они являются ошибками, то ° Пример кода для действий над строкой символов мы нс знаем, завышсно наше прсдстююснис или зани Программа в листинге 24. ! (и на тисб-сайтс излатсль Часть 10 тзх(в ь Г, гер) тах(е и г, гер) тах((е * и) е (( *а), гвр) тах((а *В+ (Г'а), гвр) Ошибка деления ))о«о «ите эь«ые тем«то«еекиероэдеэы (А+ а)'(В б) и получастс А'В 1(А "Ь+В'а+а Ь).
Это выглялит крайне непривлекательно! Но что это значит? В качестве примера прсдстзвьтс себе, что значение А равно 5.3, но имеет ошибку + ! 0«10'", а значение В равно 6.9 и имеет немного большую ошибку +2.0х10 '4. Мы получим результат 36.57 ч: (5.3'2.0'1О мч6.9'1.0'1О "~- +1.0'2.0*!0 и'!О '4). Последнее произведение этого выражения можно нс учитывать ввиду его малости— 2.0*10". Это сводит ошибку вычисления к 17.5'10и. Данное значение намного больше ошибок исходных чисел.
И, как и в предыдущем случае, даже если одно из исходных чисел является абсолютно точным, вы все равна в результате получите ошибку из-за неточности другого числа, только на этот раз ошибка получится гораздо больше. Ошибка при делении возникает примерно так же, как и при умножении. Так, если вы хотите вычислить АээВ, Таблица 24.1. Ошибки арифметических опера- циЙ. Операция Ошибка операции В табл. 24.1 еер — точность типа результата или промежуточного типа, который использовался лля получения результата, в зависимости от того, точность какого типа ниже (больше ошибка).
Ошибка, получаемая в результате выполнения любой арифметической операции, всегда больше ошибок исходных чисел. Переполнение, потеря значимости и деление на нуль нс приведет, н булет получена ошибка деления на нуль Математикам, наверное, интересно узнать, как называется такая бесконечность. алеф-нуль или С-нуль. Всем жс остальным будет интересно знать, как заставить компьютеры выдавать правильныс результаты. Порядок выполнения операций В абстрактной математике не имеет значения, в какои последовательности выполнять вычисления — результат будет одним и тем же. Так, например, А-В+С-))ч ЕЕ вссгла равно А+С ьЕ-В-))-Е и всегда равно (А+С+Е)- (Вел+В), а (А 'В)/С всегда равно (АээС) 'В. Но порялок выполнения вычислений на компьютере имеет значснис— мы помним, что каэкдая арифметическая операция посвоему влияет на точность получаемого резульпэта, и один порялок вычислений может привести к потере значимости или существенному увеличению пропорциональной ошибки, в то время как лругой нс привслст к атому, Арифметика «рооэооль«оа то««ости $ Глава 24 Стандарт С четко нс устанавливает, сколько битов должен солержать каждый из этих типов, но он устанавливает некоторос минимальное их количество.
Так, тип сйаг должен содержать, по крайней мере, о битов. Тип зйогт 1пт лолжен быть не короче, чем сйаг, и иметь минимум 16 битов. !п! должен быть не короче, чсч зйпгг ьп1, и, как и айогг !пг, иметь минимум 16 битов. 1опе !п! должен быть не короче, чем !пг, и иметь, по крайней мере, 32 бита. Он мохеет быть длиннее, но стандарт не говорит, что он далэкен быть ллиннее. Еше один не указанный в стандарте момент — какому типу соответствует тип сйаг: ппяйпеа сйзг или Иапед сйаг. Он может соответствовать как одному, так и другому.
Тем нс менее, станлзрт указывает, что тип (п! соответствует типу з1явед !пг, а тип 1ппе !пт — типу Ийпед !овп «п1. Если вы все жс хотите, чтобы тип сйаг соответствовал гип> з!епед сваг, объявите его как налей сваг. Аналогично, если нужно, чтобы тип сйаг соответствовал типу впяапед сйаг, объявите его как впз)ппеб Дааататкссаые таиатаческзсаразде ~ы Арифметика араазаальааи тачааста г 1 Часть Ш Глава 24 $ Таблица 24.2. Представление отрицательных чисел в виде дополнения до единицы и в виде Поскольку целая часть результата деления равна в правой части имеет одну переменную типа (п1 и одну ДОПОЛНЕНИЯ До ДВУХ.
нулю, неудивительно, что и значение гА равно нулю. Но переменную типа довЫе. Приведение (довЫе) позволявсс ли остальные значения будут равны 0.6666667? ет преобразовать значение переменной КХео в тип доцЫе Расглсатрим десятичное чисю Т105, лазларае и 8-битовом дааиииам иредставлсиии (лак аравию, г(лвед сЬаг) раааа О!101001, д — 105. Для получения значения 0.666666... необходимо давыполнснияопсрациидслсния. Поэтомурсзультатом , и арсдсзиааим число — 05. слопать нскоторыс преобразования, т.с.
метод представ- этого выражения является 0.666667. Дааалиеиис да единицы Даиалигиие да двух пения чисел необходимо изменить с типа зв( (целое Но как обьяснить то, что выражение Правило для получения отрицательных чисел: Правило для получения отрицательных чисел. число) на тип ЬовЫе (число с плавающей точкой). В аце(аомихе) (ТТмо!з.ТЬкее) з "Поменяйте значения битов на противоположное", "Поменяйте значения битов ма противоположное н таким языке С определены несколько правил преобразования образом, 01101001 становится 10010110 добавьте единицу", таким образом, 01! 01001 сначала типов, кроме того, некоторые свои правила может иметь тоже ласт в ответе нуль? Мы жс преобразовали его к становится 10010110 н после добавления единицы и компилятор.
Точныс правила преобразования типов типу довв(е? получим 10010111 приведены в книге 7)зе С Ргалгатт1п8 6аахиабг (К~В) Ла мы его привели к допЫе но фактически был Рассмотрим десятичное мисю 1, которое и 8-битовом двоичном предстаалеаии равно 00000001: Эти правила сводятся к слелуюшим действиям: преобразован тип самого результата, т.с. тип выражения в скобках. Это выражение, которое содержит только Далолиеиие да единицы Дааалисииг да двух Если один из операндов имеет тип )овя довЫе, прсзначения типа!и(, преобразуется в тип доцЫе после выобраювать другой операнд в тип (опя довЫе. -1 соответствует 11111110 -! соответствует 11111111 полнения операции деления.