我相信这个问题已经被问过很多次了,但我不认为有一个具体的答案。如果有,我找不到它,如果可能,请指导我。
无论如何,C 是否支持将字节/字/双字抽象为特定表示的任何方式?
浮点和双精度浮点看似是核心特性,但它们实际上并不是新的数据类型,而是对现有 dword/qword 的重新表示。
所以,我想知道,是否有可能做这样的事情:让 mydatatype 是一个 unsignedbyte ,它在编译时自动否定自己。
例如。
mydatatype a = 0xff;
将以二进制形式表示为 0x00;
我问是因为 C++ 试图通过重载 = 和类来解决这个问题,但它做了比我想要的更多的抽象,因为说,我可以这样做:
memcpy(&my_int, &my_float, 4);
然后我将被允许按位操作来玩int,然后把它放回去
memcpy(&my_float, &my_int, 4);
然而,我不相信如果说 float 被定义为一个类,我可以进行这种低级操作,而是完全抽象出除类方法之外的所有处理方法。
我很好奇,因为如果这不是 C 语言的一个特性,为什么不呢,它似乎完全符合包含浮点数和双精度数的基本原理,但是我们不能创建复数,即使它们添加起来很简单c 语言作为浮点数和双精度数。
这一直困扰着我很长一段时间,主要是因为一旦我想创建一个数据类型,我就开始迁移到 void 指针、结构和异构数据类型的领域,这似乎是不必要的。
例如: 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++ 类...
floats, doubles 是抽象的,因为它们以自己的方式运行,同时保持 ABI,但它们与复数并没有太大不同,因为复数也可以使用特定的 ABI 表示。
我的意思是,我认为我什至不能在不诉诸于创建 typedef 的情况下声明 long long long (可以吗?)...
为了使这成为一个真正的问题,我将缩小答案范围:C 中是否提供此功能?如果是这样,我该怎么做?如果没有,是否曾经考虑过这样的功能,如果没有,这仅仅是因为浮点数、双精度数是特殊的,因为历史上对实数表示的需求使得这个抽象特征成为核心特征?
我的意思是,我知道像 Fortran 这样的语言默认支持实数,但我认为 C 能够将此功能从“核心功能”中移除,并允许程序员创建抽象 ABI 类型而无需求助于指向需要释放的内存块的指针,并在处理时允许更强大的类型检查。
特别是,据我所知,唯一具有完全抽象的抽象静态数据结构是浮点数和双精度数是非常奇怪的。而所有其他实践都使用动态内存,或者允许滥用符号(使用 char,但只能用函数修改它)。
结论:C++11 似乎支持这一点,向 C 中添加新数据类型会非常混乱,由于编程中对真实表示的自然需求,需要浮点数和双精度数,虽然该功能可以通过抽象数据类型实现,但它当时使它们成为语言核心的一部分是有意义的。
谢谢!〜德米特里