我正在尝试根据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} }
那么在将一个1Byte变量转换为4Byte变量,将unsigned char转换为unsigned int时会发生什么呢?
答案 0 :(得分:6)
数值保持不变,因此将零添加到"逻辑"剩下。在构成4字节整数的底层字节中发生的情况取决于平台的字节顺序。
答案 1 :(得分:1)
最后我得到了答案。看看这个小片段:
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;
}
输出:
8位变量(测试):00001010
32位变量(测试):00000000 00000000 00000000 00001010
答案 2 :(得分:0)
为了完整性:
那么在将[..] unsigned char转换为unsigned int时会发生什么?
C11标准(草案):
6.5.4演员操作员
[...]
<强>语义强>
5 在括号内的类型名称前面加上表达式会将表达式的值转换为命名类型。这种结构称为 cast 。
和
6.5.16.1简单分配
[...]
<强>语义强>
2 在简单赋值(=)中,右操作数的值将转换为 赋值表达式并替换存储在左侧指定的对象中的值 操作数。