【发布时间】:2015-09-19 03:45:00
【问题描述】:
我编程我想将一个大端数组(我相信因为我在 Mac 上,整数将是小端)字符(或者更确切地说是 uint8_ts)转换为 int64_t 并返回。这是我的代码:
int64_t CharsToInt(uint8_t* chars) {
return chars[0] + (chars[1] * 0x100) + (chars[2] * 0x10000) + (chars[3] * 0x1000000) + (chars[4] * 0x100000000) + (chars[5] * 0x10000000000) + (chars[6] * 0x1000000000000) + (chars[7] * 0x100000000000000);
}
void IntToChars(int64_t i, uint8_t* chars) {
for(int k = 0; k < 8; k++) {
chars[k] = i >> k*8;
}
}
int main() {
int64_t x;
unsigned char chars[8];
IntToChars(x, chars);
for (int k = 0; k < 8; k++) {
printf("%0x\n", chars[k]);
}
// little endian
int64_t rv = CharsToInt(chars);
printf("%lld\n", rv);
}
如果 x 是 12,或任何其他零或正数,代码可以正常工作,但如果 x 是负数,则无法工作。
x = 12 的输出:
c
0
0
0
0
0
0
0
value: 12
x 的输出 = -12:
f4
ff
ff
ff
ff
ff
ff
ff
value: -4294967308
这似乎与符号的存储和转换方式有关,因为我认为英特尔(我在 Mac 上)使用 2s-compliment 而不是普通的旧符号位。但是,我真的不知道如何确定这是否属实,如果是,如何弥补它(最好以便携的方式)。
我知道还有很多其他类似的问题,并且我已经阅读了它们(实际上大部分代码都来自它们),但我仍然无法让它工作,所以我问了我的拥有。
【问题讨论】:
-
那么你对 -12 的期望是什么?
-
为什么你认为
FFFFFFFFFFFFFFF4对-12是错误的? -
"...普通的旧符号位。"嗯,我很确定存储符号的电子不会比 2s 补码的电子老。两者实际上都用于现代计算机系统,以及第三种表示形式:偏置整数:大多数整数架构的 2s 补码,浮点尾数的单位和浮点指数的偏置(至少对于大多数现代 CPU 使用的 IEEE754 浮点数)。
标签: c arrays hex endianness