基于整数大小的强制转换指针类型(C99)
如何(如果可能)通过整数大小定义类型?例如,如果我想创建一个3字节长的类型,我如何才能完成这样的操作?(我知道这是不正确的) 我试图编写一个通用函数,它接受一个包含多个数字的字符串参数,并将这些数字存储在一个指针中,作为另一个参数传递 但是我想这样做,你可以传递一个数值参数,它决定了存储数字的变量类型有多大:例如,如果是1,类型可以是char,如果是4,类型可以是int等等 我知道可以将数字存储在一个临时的固定大小变量中,然后根据请求的大小只将相关字节复制到指针上,但我希望代码是可移植的,我不想在Endianness上乱搞,因为我过去在这方面遇到过麻烦基于整数大小的强制转换指针类型(C99),c,pointers,casting,c99,C,Pointers,Casting,C99,如何(如果可能)通过整数大小定义类型?例如,如果我想创建一个3字节长的类型,我如何才能完成这样的操作?(我知道这是不正确的) 我试图编写一个通用函数,它接受一个包含多个数字的字符串参数,并将这些数字存储在一个指针中,作为另一个参数传递 但是我想这样做,你可以传递一个数值参数,它决定了存储数字的变量类型有多大:例如,如果是1,类型可以是char,如果是4,类型可以是int等等 我知道可以将数字存储在一个临时的固定大小变量中,然后根据请求的大小只将相关字节复制到指针上,但我希望代码是可移植的,我不想
谢谢您可以使用struct,它并不优雅,但听起来像您正在寻找的。 请注意,必须将结构对齐定义为1字节。您也被限制为64位
typedef struct Int24 {
int value : 24;
} Int;
typedef struct UInt24 {
unsigned value : 24;
} UInt24;
typedef struct Int48 {
long long value : 48;
} Int48;
带模板:
template<int bytes> struct Int {
long long value : bytes * 8;
};
typedef Int<1> Int8;
typedef Int<6> Int48;
#define DECL_INT(n) \
typedef struct _Int##n { \
long long value : n; \
} Int##n
// declaration of type
DECL_INT(48); // produces Int48
// usage
Int48 i48;
如果我很好地理解您要做的事情,如果您想要一个好的通用函数,我会使用字节链表。也许您应该看看bigint实现。如果您希望数据可移植,那么您必须处理endianess,这是没有办法的。如果数据只停留在一个平台上(无论是哪一个平台),那么您就不必担心这一点。很可能没有24位整数类型。由于
typedef
只为现有类型创建别名,而不是新类型,因此无法解决此问题--如果您确实需要它是整数类型。删除72位整数。long day:(我曾考虑过这样做,但我想要一个泛化,这样我就不必为每种大小的整数定义一个结构。使用TemplateA添加的替代方法,struct
很可能在末尾有填充——C99中没有可移植的方法来指定对齐方式。添加了宏版本.sizeof(Int48)由于结构对齐,通常会给您8字节而不是6字节。
#define DECL_INT(n) \
typedef struct _Int##n { \
long long value : n; \
} Int##n
// declaration of type
DECL_INT(48); // produces Int48
// usage
Int48 i48;
struct smallerint
{
unsigned int integer:24; //(24=24bits=3bytes)
};
typedef struct smallerint int24_t;