假设在一个32位little endian 的机器上运行下面的程序,结果是多少 ?
1.1先看以下三个程序
#include <stdio.h>
int main()
{long long a = 1, b = 2, c = 3;printf("%lld %lld %lld\n", a, b, c);     // 1 2 3printf("%d %d %d %d %d %d\n", a, b, c);  // 1 0 2 0 3 0return 0;
}
#include <stdio.h>
int main()
{long long a = -2;printf("%lld\n", a);   //-2printf("%d %d\n", a);  //-2 -1return 0;
}
1.2分析&&解答

- 正数原反补相同
- 123的补码如下
 1: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
 小端存储: 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
 2: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010
 小端存储: 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
 3: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011
 小端存储: 0011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
- 3个long long的数被当成int 去截断 所以3个数最后可以输出6个int数
- 补码是一种形式 存储是小端形式 获取的时候还要再对调回来 所以结果依次是1 0 2 0 3 0

 -2: 原码反码补码
 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010
 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1101
 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
 小端存储
 1110 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
 分成两部分
 第一部分的正常形式1111 1111 1111 1111 1111 1111 1111 1110
 原码:
 1111 1111 1111 1111 1111 1111 1111 1101
 1000 0000 0000 0000 0000 0000 0000 0010 ==> -2
第二部分的正常形式1111 1111 1111 1111 1111 1111 1111 1111
 原码:
 1111 1111 1111 1111 1111 1111 1111 1110
 1000 0000 0000 0000 0000 0000 0000 0001 ==> -1
 所以输出为-1