另一个C数据类型问题

时间:2010-04-15 22:06:46

标签: c types character

好吧,我完全得到了C的最基本的数据类型,比如short,int,long,float,确切地说,所有的数字类型。这些类型需要知道用正确的数字执行正确的操作。例如,使用FPU添加两个浮点数。所以编译器必须知道类型是什么。

但是,谈到人物,我有点不对劲。我知道基本的C数据类型char用于ASCII字符编码。但我不知道的是,为什么你甚至需要另一种字符数据类型。为什么不能只使用1字节整数值来存储ASCII字符。如果调用printf,则在调用中指定数据类型,因此可以对printf说整数表示ASCII字符。我不知道cout如何解析数据类型,但我想你可以用某种方式指定它。

另一件事是,当您想使用Unicode时,必须使用数据类型wchar。但是,如果我想使用另一种,例如ISO或Windows编码而不是UTF,该怎么办?将wchar代码字符包括为UTF-16或UTF-32(我读了它的特定编译器)。而且,如果我想使用例如一些想象中的新8字节文本编码怎么办?我应该使用什么数据类型?我实际上对此非常困惑,因为我一直期望如果我想使用UTF-32而不是ASCII,我只告诉编译器“获取我键入的字符的UTF-32值并将其保存到4个char字段中。”我认为文本编码是以结尾处理,例如打印功能。我只需要指定编译器使用的编码,因为Windows doesent在win32应用程序中使用ASCII,我想C编译器必须将我输入的char转换为ASCII,无论windows发送给C编辑器的类型是什么。

最后一件事是,如果我想用一些高数学运算的25字节整数怎么办? C没有指定自己的数据类型。是的,我知道这很困难,因为所有的数学运算都需要改变,因为CPU不能将25个字节数加在一起。但有办法吗?或者是否有一些数学库?如果我想计算Pi到1000000000000000位数怎么办? :)

我知道我的问题很长,但我只想用英语解释我的想法,因为它不是我的母语很难。而且我相信我的问题有一个简单的答案,我错过了解释一切的东西。我读了很多关于文本编码,C教程,但没有关于他的。感谢您的时间。

4 个答案:

答案 0 :(得分:2)

你的问题非常广泛,我会尝试解决你提出的一些具体问题,希望它会让你更加健康。

  • char类型可以只是另一种数字类型,就像int,short和long一样。写char a=3;是完全可以的。不同之处在于,使用char s,编译器会为您提供一些附加值。您可以将ASCII字符分配给char a='U';之类的变量,而不仅仅是数字,然后变量将获得该字符的ASCII值,您还可以使用文字字符串初始化字符数组,如下所示:char *s="hello";
    这并没有改变这样一个事实,即所有char仍然是数字类型而字符串只是一个数字数组。如果您查看字符串的内存,您将看到字符串的ASCII代码。

  • char为1字节的选择是任意的,并且由于历史原因在很大程度上保持在C中。更多现代语言如C#和Java将char定义为2个字节。

  • 字符不需要“其他”类型。 char只是保存单个烧结/无符号字节的数字类型,与short相同,是保存有符号16位字的数字类型。这种数据类型用于字符和字符串的事实只是编译器提供的语法糖。 1个字节的整数== char

  • printf()仅适用于字符,因为这是C的设计方式。它今天设计它可能会使用短裤。事实上,在Windows中你有printf()的版本可以使用短片,它被称为wprintf()

  • Windows中的wchar_t类型只是short的另一个名称。在Windows头文件中的某处有一个像这样的解除:typedef short wchar_t;这使得这种情况发生。您可以互换使用它们。使用单词wchar_t的优点是,无论谁读取您的代码,都知道您现在想要使用字符而不是数字。另一个原因是,如果微软有时会决定现在他们想要使用UTF32,那么他们需要做的就是将上面的typedef重新定义为typedef int wchar_t;,这就是它(实际上这将是相当的升技实现更复杂,因此在可见的未来不太可能发生这种变化。

  • 如果你想使用一些不是ASCII的8位编码,例如希伯来语的编码叫做“Windows-1255”你只需要使用字符。有很多这样的编码,但现在使用UNICODE总是更好。实际上,实际上有一个Unicode本身的版本适合于UTF-8的8位字符串。如果您正在处理UTF-8字符串,那么您应该使用char数据类型。没有任何东西可以限制它使用ASCII,因为它只是一个数字,它可能意味着什么。

  • 通常使用称为“十进制类型”的东西来处理这么长的数字。 C没有这个,但C#没有。这些类型的基本思想是它们处理类似于字符串的数字。十进制表示的每个数字都使用4位保存,因此8位变量可以保存0-99范围内的数字,3字节数组可以保存0-999999范围内的值,依此类推。这样您就可以保存任何范围的数字 这些方法的缺点是对它们进行计算比在正常的二进制数上进行计算要慢很多 我不确定是否有库在C中做这种事情。使用谷歌查找。

答案 1 :(得分:1)

实际上,有许多语言在编译时已知变量类型 。这确实会增加一些运行时开销。

要回答你的第一个问题,我想你会挂上“char”这个名字。 char类型 C中的一个字节整数(实际上并不完全正确 - 它是一个足以容纳基本字符集中任何字符的整数类型,但它的大小取决于实现。)注意你可以同时拥有签名字符和无符号字符,如果你在谈论只保存字符的数据类型,那就没有多大意义。但是一个字节的整数在C中称为“char”,因为这是它最常见的用途(再次参见上面的免责声明。)

你的问题的其余部分涵盖了很多的基础 - 可能更好地将其分解为几个问题。与char类型一样,wchar_t的大小取决于实现 - 唯一的要求是它足够大以容纳任何宽字符。重要的是要理解Unicode和字符编码通常实际上独立于C语言。理解字符集与字符编码不同是很重要的。

这是一篇文章(我相信SO的创始人之一),它简要介绍了字符集和编码:http://www.joelonsoftware.com/articles/Unicode.html。一旦你对他们的工作方式有了更好的理解,你就能更好地为自己制定一些问题。请注意,许多字符集(例如Windows代码页)只需要一个字节的存储空间。

答案 2 :(得分:1)

在C中,char 一个1字节的整数,它也用于存储一个字符。字符只是C中的1字节整数。

  

而且,如果我想使用该怎么办?   例如一些虚构的新8字节文本   编码

您必须根据编译器/硬件提供的类型自行构建它。一种方法可能是定义一个包含8个字符的数组的结构,并构建函数来设置所述结构以及您想要的所有操作,

  

因为如果我,我一直期待着   我想用UTF-32代替ASCII   告诉编译器“获取UTF-32值   我键入的字符并保存它   进入4个字段。

您仅限于C编译器的类型,它受硬件(以及C标准+一些历史记录)的影响很大。 C是一种低级语言,并没有提供太多魔力。也就是说,有一些库函数可能允许您在(某些)字符集之间进行转换,例如mbtowc()函数和类似的函数就是这样,你告诉它“这里有16个字节的ISO8859-1字符,请将它们转换为UTF-16到那个缓冲区中为我”。

  

最后一件事是,如果我想要的话   使用例如25字节整数   一些高数学运算? C没有   指定自己的数据类型。

C允许您定义自己的数据类型,结构。您可以在这些之上构建抽象。人们已经建立了这样的库,例如here。其他语言可能允许您更自然地模拟这些类型,例如C ++,它还允许您使用+, - ,*等运算符来处理您自己的数据类型。

答案 3 :(得分:0)

除了char(及其signedunsigned变体)之外,没有“1字节整数”类型。虽然Windows NT(即不是9x或ME)在内部使用Unicode,但是如果你以这种方式编写,你的程序将只使用Unicode - 你必须使用WCHAR和所有W版本的win32调用,或使用TCHAR#define UNICODE