C自定义数据类型

时间:2013-04-04 03:46:42

标签: c

我相信很多次都会问过这个问题,但我认为没有具体的答案。 如果有,我找不到,请尽可能指导我。

无论如何,C是否支持将字节/单词/双字抽象为某种表示的任何方式?

浮点和双精度浮点似乎是核心特征,但它们实际上并非如此 新数据类型,但重新表示现有的双字/ 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来表示。 / p>

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

为了使这个问题成为一个问题,我将把答案缩小到: 这个功能在C中可用吗?如果是的话,我怎么能这样做? 如果没有,有这样的功能曾被考虑过,如果不是因为浮动,双重是特殊的,因为历史需要实数表示,使这个抽象的功能成为核心功能?

我的意思是,我知道像Fortran这样的语言默认支持实数,但我认为C能够从“核心功能”中取出这个功能,并允许程序员创建抽象ABI类型的方法无需使用指向需要释放的内存块的指针,并允许更强的类型检查。

特别是,据我所知,具有完全抽象的唯一抽象静态数据结构是浮点数和双精度是非常奇怪的。而所有其他实践都使用动态内存,或允许滥用符号(使用char,但只修改函数)。

结论: C ++ 11似乎支持这一点,向C添加新的数据类型会非常混乱,由于编程中真实表示的自然需求,需要浮点数和双精度数,虽然该功能可以通过抽象数据类型实现,但它是有意义的当时,使他们成为语言核心的一部分。

谢谢! 〜梅德

1 个答案:

答案 0 :(得分:2)

C核心语言无法以除标准规定之外的任何方式重新解释文字。

另一方面,

C ++ 11引入了用户定义的文字,通过它可以有意义地编写

negbyte operator "" _nb(unsigned long long);

negbyte val = 0xff_nb;