【问题标题】:how to joint four single byte data to four byte data entire [duplicate]如何将四个单字节数据连接到整个四个字节数据[重复]
【发布时间】:2020-06-02 08:43:56
【问题描述】:

我想将四个单字节数据组合成一个四字节数据。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

    unsigned long int sdata = 0x12*(16^6) + 0x34*(16^4) + 0x56*(16^2) + 0x78;
    printf("%x %d", sdata, sizeof(sdata));
    return 0;
}

屏幕打印:

c20 4

我想得到:

sdata = 0x12345678

unsigned long int类型是4字节数据类型,为什么不能保存数据呢?为什么输出错误?

【问题讨论】:

    标签: c


    【解决方案1】:

    您必须使用二元运算。更准确地说,左移 (

    unsigned int sdata = 0x12<<24 | 0x34<<16 | 0x56<<8  | 0x78;
    printf("%x %zu\n", sdata, sizeof(sdata));
    

    这会产生

    12345678 4

    【讨论】:

      【解决方案2】:

      unsigned long int 并不总是 4 个字节,在许多实现中它是 8 个字节。

      正如 cmets 中所说,^ 并不代表 C 中的权力,它是一个位运算符。

      您的printf 说明符不正确,您应该在第一个中使用%lx(或者如果您想打印0x 前缀,则使用%#lx)和在第二个中使用%zu

      Demo

      转换为unsigned long 将避免整数溢出,更重要的是因为在某些实现中int 类型的大小为2 个字节。

      unsigned long int sdata = (unsigned long int)0x12*16*16*16*16*16*16 + (unsigned long int)0x34*16*16*16*16 + 0x56*(16*16) + 0x78;
      printf("%#lx %zu", sdata, sizeof(sdata));
      

      输出:

      0x12345678 8 //in this demo, as you can see, unsinged long int is 8 bytes
      

      如果可以的话,或者只使用二进制操作,如demonstrated by @chmike

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多