2010-04-15 4 views
4

Ну, я полностью получаю самые базовые типы данных C, такие как short, int, long, float, а точнее, все числовые типы. Эти типы должны быть известны, чтобы выполнять правильные операции с правильными номерами. Например, чтобы использовать FPU для добавления двух чисел с плавающей запятой. Поэтому компилятор должен знать, что такое тип.Еще один вопрос с данными C

Но, когда дело доходит до персонажей, я немного ушел. Я знаю, что базовый символ C-типа данных существует для кодирования символов ASCII. Но я не знаю, почему вам даже нужен другой тип данных для персонажей. Почему вы не могли использовать только однобайтовое целочисленное значение для хранения символа ASCII. Если вы вызываете printf, вы определяете тип данных в вызове, поэтому вы можете сказать printf, что целое число представляет символ ASCII. Я не знаю, как cout разрешает тип данных, но я думаю, вы могли бы как-то указать его.

Другое дело, если вы хотите использовать Unicode, вы должны использовать тип данных wchar. Но что, если я хотел бы использовать какую-то другую, например ISO, или кодировку Windows вместо UTF? Becouse wchar кодирует символы как UTF-16 или UTF-32 (я прочитал его специфический компилятор). И, что, если я захочу использовать, например, какое-то воображаемое новое 8-байтное текстовое кодирование? Какой тип данных я должен использовать для этого? Я на самом деле очень смущен этим, потому что я всегда ожидал, что если я хочу использовать UTF-32 вместо ASCII, я просто скажу компилятору «получить значение UTF-32 введенного мною символа и сохранить его в поле 4 символов». Я думал, что текстовое кодирование должно быть обработано до конца, например, функция печати. Мне просто нужно указать кодировку для использования компилятором, поскольку Windows doesent использует ASCII в приложениях win32, я полагаю, что компилятор C должен преобразовать символ, который я набрал в ASCII, из того, что тип посылает Windows в редактор C.

И последнее, что, если я хочу использовать, например, 25 байтовых целых чисел для некоторых высоких математических операций? C не имеет определенного типа данных. Да, я знаю, что это будет сложно, так как все математические операции нужно будет изменить, потому что ЦП не может добавить 25 байтов вместе. Но есть ли способ сделать это? Или для этого есть математическая библиотека? Что делать, если я хочу вычислить Pi до 1000000000000000 цифр? :)

Я знаю, что мой вопрос довольно длинный, но я просто хотел объяснить свои мысли как можно лучше на английском языке, поскольку его не мой родной язык трудно. И я считаю, что есть простой ответ на мой вопрос (ы), что-то, что я пропустил, это все объясняет. Я много читал о текстовом кодировании, учебниках C, но ничего о нем. Спасибо за ваше время.

+2

Чтобы получить наилучшие ответы, в будущем вы должны использовать несколько вопросов, а не связывать их все с одним. – caf

+0

Спасибо, подумал я, я не буду слишком беспокоить этот форум, если бы связал похожие вопросы вместе. –

ответ

2

Ваш вопрос очень широк, я постараюсь решить некоторые конкретные вопросы, которые вы подняли, надеюсь, он заставит вас больше разбираться.

  • Тип char может быть хотя, как только другой числовой тип, так же, как межд, короткие и длинные. Вполне нормально писать char a=3;. Разница в том, что с char s компилятор дает вам дополнительную добавленную стоимость. вместо простых чисел вы также можете назначить символы ASCII переменной, например char a='U';, а затем переменная получит значение ASCII этого символа, и вы также можете инициализировать массивы символов, используя литературные строки: char *s="hello";.
    Это не меняет того факта, что после того, как char все еще является числовым типом, а строка представляет собой просто массив чисел. Если вы посмотрите на память строки, вы увидите коды ASCII строки.

  • Выбор , являющийся 1 байтом, является произвольным и в значительной степени хранится таким образом в C по историческим причинам. более современные языки, такие как C# и Java, определяют char как 2 байта.

  • Для символов вам не нужен «другой» тип. char - это только числовой тип, который содержит одиночный байт с одиночным/без знака, такой же, как short - это числовой тип, который содержит подписанное 16-битное слово. Тот факт, что этот тип данных используется для символов и строк, - это просто синтаксический сахар, предоставленный компилятором. 1 байтовые целые числа == char.

  • printf() работает только с символами, так как это был способ C. он был спроектирован сегодня, возможно, будет работать с шортами. Действительно, в окнах у вас есть версия printf(), которая работает с трусами, она называется wprintf()

  • типа wchar_t, в окнах, это просто другое название для short. где-то в файлах заголовков Windows происходит такое объявление: typedef short wchar_t;, что и делает это. Вы можете использовать их взаимозаменяемо. Преимущество использования слова wchar_t в том, что тот, кто читает ваш код, знает, что теперь вы хотите использовать символы, а не цифры. Другая причина заключается в том, что если есть вероятность, что когда-нибудь Microsoft решит, что теперь они хотят использовать UTF32, то все, что им нужно сделать, это переопределить typedef выше, чтобы быть typedef int wchar_t;, и это все (на самом деле это будет довольно сложным для достижения поэтому это изменение маловероятно в ожидаемом будущем)

  • Если вы хотите использовать некоторую 8-битную кодировку, которая не является ASCII, например кодировку для иврита, которая называется «Windows-1255», вы просто используете символы. Существует много таких кодировок, но в наши дни использование UNICODE всегда предпочтительнее. Действительно, на самом деле есть версия самого Юникода, которая вписывается в 8-битные строки, которые являются UTF-8. Если вы имеете дело с строками UTF-8, то вы должны работать с типом данных char. Нет ничего, что ограничивало бы его работу с ASCII, поскольку это просто число, это может означать что угодно.

  • Работая с такими длинными числами, как правило, делается с использованием так называемых десятичных типов. C не имеет этого, но C# делает. Основная идея этих типов заключается в том, что они обрабатывают число, похожее на строку. Каждая цифра десятичного представления сохраняется с использованием 4 бит, поэтому 8-битная переменная может сохранять числа в диапазоне 0-99, 3-байтовый массив может сохранять значения в диапазоне 0-999999 и т. Д. Таким образом вы можете сохранить номера любого диапазона.
    Недостатком этого является то, что расчеты на них намного медленнее, чем вычисления обычных двоичных чисел.
    Я не уверен, есть ли библиотеки, которые делают такие вещи в C. Используйте Google, чтобы узнать.

+2

'char' может быть либо подписанным, либо неподписанным - это зависит от компилятора; и 'short' * всегда * подписан (не без знака, как вы говорите). – caf

0

Существует (было) нет типа «1-байтового целого», кроме charsigned и unsigned его вариантов). И хотя Windows NT (т.е. не 9x или ME) не использует Unicode внутри, ваша программа будет использовать Unicode только в том случае, если вы напишете ее так: вам нужно либо использовать WCHAR, либо все версии W-вызовов win32 или использовать TCHAR и #define UNICODE.

1

На самом деле, есть много языков, где типов переменных ARENT известен во время компиляции. Тем не менее, это приводит к некоторому увеличению времени выполнения.

Чтобы ответить на ваш первый вопрос, я думаю, что вы повесились на имя «char». Тип char равен однобайтовое целое число в C (на самом деле это не совсем верно - это интегральный тип, достаточно большой для хранения любого символа из базового набора символов, но его размер зависит от реализации). Обратите внимание, что вы можете иметь оба подписанных символа и неподписанные символы, что не имеет большого смысла, если вы говорите о типе данных, который содержит только символы.Но один байт целое называется «символ» в C, потому что это наиболее распространенное использование для этого (опять см отказ от ответственности выше.)

Остальная часть вашего вопроса охватывает много из наземного, возможно, было бы лучше, чтобы сломать это на несколько вопросов. Как и тип char, размер wchar_t зависит от реализации - единственное требование состоит в том, чтобы оно было достаточно большим, чтобы удерживать любой широкий символ. Важно понимать, что Unicode и кодировки символов вообще не зависят от языка C. Также важно понимать, что наборы символов - это не то же самое, что кодировки символов.

Вот статья (как мне кажется, один из основателей SO), который дает краткое введение в наборы символов и кодировки: http://www.joelonsoftware.com/articles/Unicode.html. Как только вы лучше поймете, как они работают, вы сможете лучше сформулировать некоторые вопросы для себя. Обратите внимание, что для множества наборов символов (например, кодовая страница Windows) требуется только один байт хранилища.

+0

На самом деле, стандарт C определяет «' char' »и« byte »таким образом, что' char' всегда * * один байт. – SamB

+0

Это правда, но стандарт также определяет байт, чтобы быть «достаточно большим, чтобы содержать любой символ из базового набора символов». Определение, используемое стандартом C, немного отличается от того, что обычно означает байт слова. Но, возможно, я должен был быть более точным и сказал, что символ C не обязательно является октетом. –

1

В C, char есть 1 байтовое целое число, которое также используется для хранения символа. Персонаж просто 1 байт целое число в С

И что, если я хотел бы использовать для примера некоторые мнимые новый 8 байт текста кодирования?

Вам нужно будет самостоятельно создать его на основе типов, доступных через ваш компилятор/оборудование. Один из подходов могут быть определение структуры с массивом из 8 символов, и построить функцию maniuplate сказала структуру со всеми операциями, вы хотите на что,

becouse Я всегда ожидал, что если я хочу использовать UTF-32 вместо ASCII, я просто сказать компилятор «получить UTF-32 значение персонажа я типизированных и сохранить его в поле 4 полукокса.

Вы ограничены типами вашего компилятора Си , на который сильно влияет аппаратное обеспечение (и стандарт C + бит истории). C - язык низкого уровня и не обеспечивает много ГИК. Тем не менее, существуют библиотечные функции, которые могут позволить вам переводить между (некоторыми) наборами символов, например. функция mbtowc() и т. д., которая делает именно это, вы говорите «вот 16 байт символов ISO8859-1, переведите их в UTF-16 в этот буфер там, пожалуйста,».

И последняя вещь, что если я хочу использовать, например, 25 байт целого числа для некоторые высокие математические операции? C не имеет типа данных .

C позволяет вам определять свои собственные типы данных, структуры. Вы можете построить абстракцию поверх них. У людей есть библиотеки, подобные этому, см., Например, here. Другие языки могут позволить вам более естественно моделировать такие типы, как C++, которые также позволяют вам перекрывать операторы типа +, -, * и т. Д. Для работы с вашими собственными типами данных.

Смежные вопросы