C++ 将1字节数据转换为4字节时会发生什么详细情况

C++ 将1字节数据转换为4字节时会发生什么详细情况,c++,c,casting,C++,C,Casting,我试图在C/C++中根据RFC1321实现MD5算法,但在类型转换方面遇到了一些问题 typedef unsigned int uint4; // 32 Bit (4 Byte) typedef unsigned char uint1; // 8 Bit (1 Byte) // pseudocode uint1 byte = {1,0,0,1,1,1,1,0}; // 0b10011110 uint4 t_uint4 = (uint4)byte; uint4 = { ??? } //

我试图在C/C++中根据RFC1321实现MD5算法,但在类型转换方面遇到了一些问题

typedef unsigned int uint4;  // 32 Bit (4 Byte)
typedef unsigned char uint1; //  8 Bit (1 Byte)

// pseudocode
uint1 byte = {1,0,0,1,1,1,1,0}; // 0b10011110
uint4 t_uint4 = (uint4)byte;

uint4 = { ??? }

// maybe like this??
uint4 = { {1,0,0,1,1,1,1,0},{???},{???},{???} }
uint4 = { {???},{???},{???},{1,0,0,1,1,1,1,0} }

那么,当将一个1字节的变量转换成一个4字节的变量,将一个无符号的字符转换成一个无符号的整数时,会发生什么详细情况呢?

数值保持不变,因此在“逻辑”左侧添加零。在构成4字节整数的底层字节中发生的位置取决于平台的endianness

完整性:

那么[…]将[…]无符号字符转换为无符号整数时会发生什么情况呢

C11标准(草案):

6.5.4铸造操作员

[……]

语义

5在表达式前面加括号的类型名称将表达式的值转换为命名类型。这种结构被称为铸造

6.5.16.1简单作业

[……]

语义

2在简单赋值(=)中,右操作数的值转换为 赋值表达式,并替换存储在由左 操作数


最后我得到了答案。看看这个小片段:

typedef unsigned char uint1;    // 1 Byte ( 8 Bit)
typedef unsigned int uint4;     // 4 Byte (32 Bit)

uint1 test=10;
uint4 test2=(uint4)test;


cout << sizeof(uint1)*8 << " Bit-" << "Variable (test): ";

for (int i=0; i<sizeof(test)*8; i++) {
    if ((test << i) & 0x80)
        cout << 1;
    else
        cout << 0;
}
cout << endl;
cout << sizeof(uint4)*8 << " Bit-" << "Variable (test2): ";

for (int i=0; i<sizeof(test2)*8; i++) {
    if ((test << i) & 0x80000000)
        cout << 1;
    else
        cout << 0;
}
typedef无符号字符uint1;//1字节(8位)
typedef unsigned int uint4;//4字节(32位)
uint1试验=10;
uint4测试2=(uint4)测试;

无法阅读“big-endian”和“little-endian”。此代码无法编译。除非提供语法正确的代码,否则很难准确理解您的要求。我可以做出假设,但很可能我对你真正想知道的东西错了。在我看来,您可能会询问将字节强制转换为int32或将字节数组重新解释为整数。结果会有所不同。请用可编译代码替换伪代码。我不确定您要查找的详细信息有多少,但就逐位而言,4字节变量的最低有效位等于1字节变量,而其他3个字节都为零。这里没有魔力。如果
uint1
具有值158,则
uint4
也将具有值158。我真的不知道这是怎么回答这个问题的。写一些代码来了解实际行为是一件很棒的事情;道具。但请注意,正如Matteo Italia中所指出的,实际的底层字节顺序将有所不同,这取决于您的系统(或封送处理基础设施,或其他)是big-endian还是little-endian。(通常情况下,这在程序中并不重要;在程序间传输数据时,考虑数据通常是很重要的,因为数据通常一次传输一个字节,所以必须从单个字节重新组装Its和其他数据)。假设您的平台使用2的补码表示,填充值(32位值中0的3个字节)将是1而不是0(以保留符号)。