0
点赞
收藏
分享

微信扫一扫

[C语言]大小端及整形输出问题

Separes 2023-12-18 阅读 33

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 3
	printf("%d %d %d %d %d %d\n", a, b, c);  // 1 0 2 0 3 0
	return 0;
}
#include <stdio.h>
int main()
{
	long long a = -2;
	printf("%lld\n", a);   //-2
	printf("%d %d\n", a);  //-2 -1
	return 0;
}

1.2分析&&解答

在这里插入图片描述

  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. 3个long long的数被当成int 去截断 所以3个数最后可以输出6个int数
  4. 补码是一种形式 存储是小端形式 获取的时候还要再对调回来 所以结果依次是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

举报

相关推荐

0 条评论