【问题标题】:Casting to 8 bytes variable takes only 4 bytes转换为 8 字节的变量只需要 4 个字节
【发布时间】:2023-01-13 19:40:41
【问题描述】:

我的结构包含两个字段:

struct ggg {
    unsigned long long int a;
    unsigned int b;
};

字段a 应为 8 个字节长,而b 字段应为 4 个字节长。

试图将其转换为字节数组:

        unsigned char c[8 + 4] = { 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
                                   0x03, 0x00, 0x00, 0x00, };
        ggg* g = (ggg *)c ; 
        char tt[1024];
        sprintf(tt, "a=%d b=%d ", g->a, g->b);

tt 字符串中得到结果:

 a=1 b=2

看起来在投射 a 时只需要 4 个字节而不是 8 个字节。为什么?

【问题讨论】:

    标签: visual-c++


    【解决方案1】:

    问题不在于转换,而在于您的 sprintf 格式说明符。您正在使用 %d,这意味着 signed int,通常是 4 个字节。

    尝试将格式字符串更改为 "a=%llu b=%u",您更有可能获得预期的输出。

    【讨论】:

    • 我应该补充一点,像这样的转换结构通常不可移植,并且结果可能因不同的编译器或平台位数 (32/64) 而异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2020-07-21
    • 2011-02-19
    相关资源
    最近更新 更多