Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于整数大小的强制转换指针类型(C99)_C_Pointers_Casting_C99 - Fatal编程技术网

基于整数大小的强制转换指针类型(C99)

基于整数大小的强制转换指针类型(C99),c,pointers,casting,c99,C,Pointers,Casting,C99,如何(如果可能)通过整数大小定义类型?例如,如果我想创建一个3字节长的类型,我如何才能完成这样的操作?(我知道这是不正确的) 我试图编写一个通用函数,它接受一个包含多个数字的字符串参数,并将这些数字存储在一个指针中,作为另一个参数传递 但是我想这样做,你可以传递一个数值参数,它决定了存储数字的变量类型有多大:例如,如果是1,类型可以是char,如果是4,类型可以是int等等 我知道可以将数字存储在一个临时的固定大小变量中,然后根据请求的大小只将相关字节复制到指针上,但我希望代码是可移植的,我不想

如何(如果可能)通过整数大小定义类型?例如,如果我想创建一个3字节长的类型,我如何才能完成这样的操作?(我知道这是不正确的)

我试图编写一个通用函数,它接受一个包含多个数字的字符串参数,并将这些数字存储在一个指针中,作为另一个参数传递

但是我想这样做,你可以传递一个数值参数,它决定了存储数字的变量类型有多大:例如,如果是1,类型可以是char,如果是4,类型可以是int等等

我知道可以将数字存储在一个临时的固定大小变量中,然后根据请求的大小只将相关字节复制到指针上,但我希望代码是可移植的,我不想在Endianness上乱搞,因为我过去在这方面遇到过麻烦


谢谢

您可以使用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;