我得到了一个包含8个位置的char数组(char数据[8];),这个数组上有一个无符号长long int值(8个字节大小)... data [0]有long long的第一个字节int,data [1]有第二个,依此类推 . 我的问题是如何将该值再次放在unsigned long long变量上?
我试过班次,但 Value 不等于原始值,我怎么能这样做而不改变原来的数组......
字节的顺序是小端的变量的正常顺序(从高位到低位)
这是一个打印不同于预期值的代码 .
char vec[8]={0,0,0,0,0,0,0,1};
unsigned long long value = *((unsigned long long*) vec);
std::cout<<value;
return 0;
结果应该是一个,而是72057594037927936.感谢您的耐心等待 .
4 回答
假设
data
数组的字节顺序与结果long long
值相同避免基于铸造的解决方案 . 它们违反了严格别名的语义,因此无法保证工作 .
根据硬件表示,直接强制转换可能不起作用,这在大多数情况下都适用:
你可以做:
但这假定:
data
已正确对齐以作为long long
进行访问 . 例如,如果long long
需要8字节对齐但data
只有4字节对齐,那么它可以做坏事 .data
的字节存储顺序与当前机器long long
的字节顺序相同 . 见Endianness .说第一个字节是什么意思?它是最不重要的字节还是最重要的字节?
该问题的答案决定数值是小端还是大端 . wikipedia link
如果值的endian样式与系统相同,则可以直接将第一个字节的地址转换为“unsigned long long *”,而如果它不相同则必须转换其endian样式 .