2013-04-04 127 views
1

我相信这个问题已经被问了很多次了,但我不认为有一个具体的答案。 如果有,我找不到它,如果可能请指示我。C自定义数据类型

不管怎样,C是否支持任何方式将字节/单词/双字抽象成某种表示?

浮点和双精度浮点似乎是核心功能,但它们实际上并不是 新的数据类型,而是重新表示现有的dword/qword。

所以,我想知道是否可以这样做: 让mydatatype是一个unsignedbyte,它在编译时自动否定自身。

例如。

mydatatype a = 0xff; 

将以二进制形式表示为0x00;

我问,因为C++试图与超载=和类解决这个问题,但它确实有点 更抽象,比我想的,因为说,我不允许这样做:

memcpy(&my_int, &my_float, 4); 

然后,我将被允许按位操作玩弄int和 把它回来

memcpy(&my_float, &my_int, 4); 

然而,我不相信,如果说,浮球被定义为一类,我能做到这一点低水平 操作,而是完全抽象出除了类方法以外的所有处理方法。

我很好奇,因为,如果这不是C语言的特征,为什么不呢,这似乎与 完全适合包括花车和双打的理由,但我们不能创建复杂的数字,即使他们 会就像浮点和双打一样简单地添加到c语言中。

这一直困扰着我很长一段时间,主要是因为只要我想创建一个数据类型,我开始迁移到void指针,结构和hetrogenous数据类型的领域,这似乎 是联合国-必要。

例如: void * my_data_type = my_data_type_new(0xff); 这将“否定”0xff到0,并将其存储在my_data_type指向的内存中。

这似乎是不必要的,因为我只想要的是 negchar my_data_type = 0xff;

编译器可以设法识别。

,然后我可以

memcpy(&my_char, &negchar, 1); 

和my_char将为0

以上的C++类不成立...在保持ABI的同时,双打在抽象意义上是抽象的,但它们与说复杂数字并没有太大区别,因为复数也可以用特定的ABI来表示。

我的意思是,我不认为我甚至可以声明很长很长很长(可以吗?),而不是诉诸创建的typedef ...

为了使这实际上是一个问题,我将缩小答案到: 此功能是否可用于C?如果是这样,我该怎么做? 如果没有,有这样一个功能曾经被考虑过,如果不是这只是因为浮动,双打是特殊的由于历史需要的实数表示,使这个抽象特征成为核心功能?

我的意思是,我明白像Fortran这样的语言在默认情况下支持实数,但我认为C将能够从“核心功能”中获取此功能,并允许程序员创建抽象ABI类型,而不需要求助于指向需要释放的内存块的指针,并允许在此处进行更强大的类型检查。

特别是,据我所知,如何抽象完全抽象的静态数据结构是float和double是非常奇怪的。而所有其他做法都是在动态内存中进行操作,或者允许滥用符号(使用字符,但只能用函数修改)。

结论: C++ 11似乎支持这一点,添加新的数据类型和C会很混乱,花车和双打都需要因编程实陈述的自然需求,而功能可以通过执行抽象的数据类型,它使它们成为语言核心的一部分是有意义的。

谢谢! 〜德米特里

+0

缩进一行以4个空格导致其被格式化为代码。使用[编辑]链接来改进问题的可读性。 – 2013-04-04 03:54:55

回答

2

C核心语言没有提供任何方式来重新解释标准规定以外的任何方式的文字。

C++ 11,在另一方面,引入了用户定义的文本,由你可以有意义地写

negbyte operator "" _nb(unsigned long long); 

negbyte val = 0xff_nb; 
+0

这就是我想知道的,nb并不完全是我想要的,但它做到了我所做的。谢谢。 – Dmitry 2013-04-04 03:58:11