Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ansi. Показать все сообщения
Показаны сообщения с ярлыком ansi. Показать все сообщения

среда, 5 февраля 2020 г.

Символьные константы в языке Си

#c #символы #ansi


Вопрос больше философского характера, чем технического. По определению константой
в языке Си назвается такая переменная, которую нельзя изменять по ходу выполнения программы
и такая переменная доступна только для чтения. Вопрос с объявлением числовых констант
отпадает сразу - и так ясно, что имеется в виду 

int const a = 5;


Такое объявление и описание не вызывает особых трудностей для понимания. Что же подразуемвается
под символьной константой? Языком лысого ёжика, это числовой код, которому соответствует
символьное отображение (ASCII-код). Но что здесь является константой; в чем выражается
неизменность? Что каждому символу соответствует данный код? Но как мы его изменим?
Ведь язык не допускает такую конструкцию:

'a' = 666;


Вопрос, на которого я требую ответа: "В чем выражается неизменность символьных констант?"
    


Ответы

Ответ 1



Термин константа в языке С имеет строгое определение. По определению, термин константа обозначает именно и только буквальные литеральные значения: 25, 'f', 0x13, 3.1415. Также термин константа в языке С распространяется на члены перечислений, результат _Alignof и sizeof (с некоторыми исключениями). Это все. Объекты, объявленные со спецификатором const, константами в языке С не являются. Ваше int const a = 5; это ни в коем случае не константа в языке С (!). Это просто, скажем так, "немодифицируемая переменная". Важность правильного понимания термина константа обуславливается тем, что ряд контекстов в языке С требует использования именно констант и константных выражений. Например, инициализатор для статического объекта должен быть именно константой. Ваше a в этой роли использовать не получится int const a = 5; static int x = a; // Ошибка - инициализатор не константен Символьными константами в С называются константы вида 'a' (также сюда можно причислить мультисимвольные константы вида 'abc'). Они не являются lvalue. Не существует никаких корректных конструкций языка С, которые могли бы их изменить. В этом и заключается их "неизменность". То есть вторая часть вашего вопроса действительно содержит правильный ответ. Невозможно "изменить" то, что не является lvalue.

Ответ 2



Символьная константа – это некоторый символ алфавита, заключенный в одиночные кавычки. Значением символьной константы является целое число, равное ASCII коду данного символа. Символьная константа имеет тип int или char и размерно состовляет 16 или 8 бит, соответственно.

вторник, 7 января 2020 г.

Что за кодировка ANSI в Notepad++

#кодировка #ansi


Приветствую всех. Открыл Notepad++. Там есть возможность преобразовать в ANSI. Непонятно,
что в этой программе подразумевается под кодировкой ANSI, ведь такой кодировки вроде
как несуществует. Насколько я знаю ANSI - это неофициальное обобщенное название кодировок
windows 1251, windows 1252, ascii(7bit). Так в какую кодировку будет преобразован текст ? 
    


Ответы

Ответ 1



В Windows под ANSI codepage обычно понимается «системная» кодировка. Она используется для не-юникодных программ (и кажется для не-юникодных файловых систем). Для стандартной американской версии это CP 1252, для русской — CP 1251. Хотя название и ссылается на стандарт ANSI, реально оно ничего общего со стандартом не имеет. Чаще всего это однобайтная кодировка, но для некоторых систем (например, японской) это MBCS. Следует различать ANSI-кодировку (используемую для не-юникодных Windows-программ) и OEM-кодировку (используемую для не-юникодных DOS-программ, в случае русской Windows это CP 866).

Ответ 2



Посмотрите ответ на ваш вопрос в официальной документации.

Ответ 3



Насколько я знаю ANSI - это неофициальное обобщенное название кодировок windows 1251, windows 1252, ascii(7bit). Так в какую кодировку будет преобразован текст ? Насколько я помню, там подразумевается общая их часть. Т. е. однобайтовая кодировка, со всеми кодами до 128. Всё, что вне этой области, превратится в вопросы.

четверг, 2 января 2020 г.

Разница в количестве возвращаемых строк при явной и неявной группировке на пустой таблице

#sql #oracle #ansi #oracle18c


Ни для кого не секрет, что агрегатная функция на пустой таблице, например:

create table t1 (id number);

select count (1) from t1;


вернёт вернёт одну строчку:

  COUNT(1)
----------
         0


Как известно, здесь будет произведена неявная групировка с объединением всех записей
в одну общую группу. Согласно стандарту SQL, даже если результат такой группировки
не содержит ни одной строчки, он будет преобразован в одну строчку. Поэтому, результат
запроса выше объясним и широко известен.

Но можно задать глобальную группировку, т.е. без указания полей для группировки, явно:

select count (1) from t1 group by ();


и результат не совсем ожидаемый:


  no rows selected


Почему при явной группировке результат отличается? 
    


Ответы

Ответ 1



Возможность явной группировки без указания полей group by () была введена в стандарте SQL:1999 совместно с введением Grouping Sets. Реализована она была в версии 9iR1 в 2001 году. С тех пор, включая 12c, реализация была выполнена с отличающимся поведением при явной и неявной группировке. В актуальном стандарте SQL:2016-2 явно указано, что должна выполнятся синтаксическая трансформация с добавлением group by (), где требуется глобальная группировка, но group by явно не задан. В релизе 18c Oracle, без какого-либо упоминания в списке изменений или документации, изменил поведение явной глобальной групировки: 18c> select count (1) from t1 group by (); COUNT(1) ---------- 0 PS Вероятно, это можно разценить как желание более полного соответствия стандартам. Есть надежда, что дойдёт очередь и до других отклонений от стандарта, таких как - пустая строка интерпретируется как NULL.

суббота, 7 декабря 2019 г.

Что есть ANSI и ASCII

#c #utf_8 #ascii #ansi


Я бы хотел, наконец, разобраться, как правильно называть строки 8-ми битных символов.

Что такое строка символов UTF-8 мне хорошо понятно - это строка, каждый символ которой
представлен переменным количеством 8-ми битных блоков (байтов).

Что такое строки UTF-16/UTF-32 мне тоже ясно.

Но я не могу понять, как корректно называть восьмибитные кодировки, где первые 128
знаков строго определены, а последующие - меняются в зависимости от используемой кодовой
страницы.

Кто-то их называет ascii, кто-то ansi, или просто CP1251, если подразумевается конкретная
кодировка.

Помогите разобраться. Гугл только запутал.
    


Ответы

Ответ 1



ASCII (American Standard Code for Information Interchange) - первый вариант кодировки. Потом появились CP866, KOI8-R, Windows 1251 и вот это всё. Так что, CP1251 - это расширенная версия ASCII. ANSI - это расширения ASCII, в которых были удалены псевдографические элементы и добавлены символы типографики. CP1251 - это пример ANSI кодировки. Если на диаграмме Эйлера показать:

Ответ 2



ASCII (читается аски́) - это первая кодировка применявшаяся еще в пору когда 99% юзеров SO еще даже не родились (1963 год). Кодировка 7-битная, то есть определено 128 символов, 8-й бит полного байта использовался для проверки четности поскольку в то время каналы были ненадежные, то предполагалось что будет проверяться каждый полученный байт. Далее со временем стало понятно, что для других языков можно использовать 8-й бит для отображения национальных символов - то есть использовать 256 символов. Эту расширенную 8-битовую кодировку условно называют ANSI (читается анси́) по названию американского института стандартов в рамках которого и была предложена 8-битовая кодировка. Соответственно, для каждого национального языка была предложена своя раскладка второй половины таблицы (от 128 до 255 символа), а первая половина таблицы от 0 до 127 - изначальные символы ASCII. KOI-8, CP-1251, 1252 и проч. - это различные инкарнации ANSI Далее когда дело дошло до иероглифов стало понятно, что в 256 символов не уместиться и появилась UNICODE (читается юникод) - где на 1 символ отводится 2 байта, то есть 65536 символов, где таблица была жестко поделена между национальными символами, например таблица ASCII осталась в интервале U+0000 до U+007F, а наша с вами кириллица в интервале U+A640 до U+A69F ну и т.д. С нарастанием угара стало ясно что 65536 символов также не хватает, потому что появились эмодзи, стали поднимать голову другие национальные символы справедливо указывавшие на нехватку места в таблице UNICODE, тогда был предложен UTF-8 (читается ютиэф 8), где количество байтов в символе имеет разную длину и может быть от 1-го до 4 байт, что дает 1 112 064 символов. Вот, как то так.

Ответ 3



Считаю название «восьмибитные» или «однобайтовые кодировки» вполне корректным общим названием для подобных вещей. Само собой, если подразумевается какая-то конкретная кодовая страница/кодировка, то она и указывается: «KOI8-R», «CP1251» «CP1250», «ISO8859-5». ASCII как стандарт (а это действительно стандарт — American standard code for information interchange) определяет, если я правильно помню, только первые 127 кодов символов. Поэтому формально символы типа «я», «č», «њ», «Ḱ» не принадлежат ASCII. «ANSI» — это вообще исключительно русскоязычный (sic!) термин для CP1251, т.к. вообще-то это сокращение обозначает американский национальный институт стандартизации (а «OEM» — original equipment manufacturer).

понедельник, 8 апреля 2019 г.

Символьные константы в языке Си

Вопрос больше философского характера, чем технического. По определению константой в языке Си назвается такая переменная, которую нельзя изменять по ходу выполнения программы и такая переменная доступна только для чтения. Вопрос с объявлением числовых констант отпадает сразу - и так ясно, что имеется в виду
int const a = 5;
Такое объявление и описание не вызывает особых трудностей для понимания. Что же подразуемвается под символьной константой? Языком лысого ёжика, это числовой код, которому соответствует символьное отображение (ASCII-код). Но что здесь является константой; в чем выражается неизменность? Что каждому символу соответствует данный код? Но как мы его изменим? Ведь язык не допускает такую конструкцию:
'a' = 666;
Вопрос, на которого я требую ответа: "В чем выражается неизменность символьных констант?"


Ответ

Термин константа в языке С имеет строгое определение. По определению, термин константа обозначает именно и только буквальные литеральные значения: 25, 'f', 0x13, 3.1415. Также термин константа в языке С распространяется на члены перечислений, результат _Alignof и sizeof (с некоторыми исключениями). Это все.
Объекты, объявленные со спецификатором const, константами в языке С не являются. Ваше
int const a = 5;
это ни в коем случае не константа в языке С (!). Это просто, скажем так, "немодифицируемая переменная".
Важность правильного понимания термина константа обуславливается тем, что ряд контекстов в языке С требует использования именно констант и константных выражений. Например, инициализатор для статического объекта должен быть именно константой. Ваше a в этой роли использовать не получится
int const a = 5; static int x = a; // Ошибка - инициализатор не константен
Символьными константами в С называются константы вида 'a' (также сюда можно причислить мультисимвольные константы вида 'abc'). Они не являются lvalue. Не существует никаких корректных конструкций языка С, которые могли бы их изменить. В этом и заключается их "неизменность". То есть вторая часть вашего вопроса действительно содержит правильный ответ. Невозможно "изменить" то, что не является lvalue.