获取 C 4 字节字符串的值作为 uint
Getting the value of a C 4-byte string as a uint
简而言之,我的问题是:我正在构建一个动态内存管理器,其中包含各种不同类型的对象。我用标签标记每种不同类型的对象,并且为了使内存调试更容易,我希望这些标签在内存中显示为我可以读取的四字节字符串。但是,为了有效地打开这些值,我还想将它们视为无符号 32 位整数。
目前对象的定义如下:
/**
* an object in cons space.
*/
struct cons_space_object {
char tag[TAGLENGTH]; /* the tag (type) of this cell */
uint32_t count; /* the count of the number of references to this cell */
struct cons_pointer access; /* cons pointer to the access control list of this cell */
union {
/* if tag == CONSTAG */
struct cons_payload cons;
/* if tag == FREETAG */
struct free_payload free;
/* if tag == INTEGERTAG */
struct integer_payload integer;
/* if tag == NILTAG; we'll treat the special cell NIL as just a cons */
struct cons_payload nil;
/* if tag == REALTAG */
struct real_payload real;
/* if tag == STRINGTAG */
struct string_payload string;
/* if tag == TRUETAG; we'll treat the special cell T as just a cons */
struct cons_payload t;
} payload;
};
标签是四个字符串常量,例如:
#define CONSTAG "CONS"
我想要的是
switch ( cell.tag) {
case CONSTAG : dosomethingwithacons( cell);
break;
但是你当然不能打开字符串。然而,由于这些是四字节字符串,它们可以作为 32 位无符号整数在内存中读取。我想要的是一个宏,给定一个字符串作为参数,returns 是一个无符号整数。我试过了
/**
* a macro to convert a tag into a number
*/
#define tag2uint(tag) ((uint32_t)*tag)
但它实际上做的是 return 作为该地址第一个字符的 ASCII 值的数字 - 即
tag2uint("FREE") => 70
这是'F'的ascii码。
谁能帮我解决这个问题?我用 C 编写任何严肃的东西已经二十年了。
#define tag2uint(tag) ((uint32_t)*tag)
表示"dereference tag
(get 'F'
in your example), then convert it to uint32_t
."
你想做的应该是
#define tag2uint(tag) (*(uint32_t*)tag)
这意味着 "treat tag
as pointer to uint32_t
, then dereference it."
简而言之,我的问题是:我正在构建一个动态内存管理器,其中包含各种不同类型的对象。我用标签标记每种不同类型的对象,并且为了使内存调试更容易,我希望这些标签在内存中显示为我可以读取的四字节字符串。但是,为了有效地打开这些值,我还想将它们视为无符号 32 位整数。
目前对象的定义如下:
/**
* an object in cons space.
*/
struct cons_space_object {
char tag[TAGLENGTH]; /* the tag (type) of this cell */
uint32_t count; /* the count of the number of references to this cell */
struct cons_pointer access; /* cons pointer to the access control list of this cell */
union {
/* if tag == CONSTAG */
struct cons_payload cons;
/* if tag == FREETAG */
struct free_payload free;
/* if tag == INTEGERTAG */
struct integer_payload integer;
/* if tag == NILTAG; we'll treat the special cell NIL as just a cons */
struct cons_payload nil;
/* if tag == REALTAG */
struct real_payload real;
/* if tag == STRINGTAG */
struct string_payload string;
/* if tag == TRUETAG; we'll treat the special cell T as just a cons */
struct cons_payload t;
} payload;
};
标签是四个字符串常量,例如:
#define CONSTAG "CONS"
我想要的是
switch ( cell.tag) {
case CONSTAG : dosomethingwithacons( cell);
break;
但是你当然不能打开字符串。然而,由于这些是四字节字符串,它们可以作为 32 位无符号整数在内存中读取。我想要的是一个宏,给定一个字符串作为参数,returns 是一个无符号整数。我试过了
/**
* a macro to convert a tag into a number
*/
#define tag2uint(tag) ((uint32_t)*tag)
但它实际上做的是 return 作为该地址第一个字符的 ASCII 值的数字 - 即
tag2uint("FREE") => 70
这是'F'的ascii码。
谁能帮我解决这个问题?我用 C 编写任何严肃的东西已经二十年了。
#define tag2uint(tag) ((uint32_t)*tag)
表示"dereference tag
(get 'F'
in your example), then convert it to uint32_t
."
你想做的应该是
#define tag2uint(tag) (*(uint32_t*)tag)
这意味着 "treat tag
as pointer to uint32_t
, then dereference it."