题目背景
计算机在内存中存储整数时,一般按字节为逻辑单位进行存储,有“小端序”和“大端序”之分。
小端序(little-endian)是指将表示整数的低位字节存储在内存地址的低位,高位字节存储在内存地址的高位。
而使用大端序(big-endian)方式存储时,存储顺序正好相反。
题目描述
对于一个存储在小(大)端机上的整数,该整数在大(小)端机上会被系统识别为哪个整数?
输入格式
输入文件共若干行,每行一个整数 xx。
输出格式
对于每个输入的整数 xx,在输出文件中打印一行。
该行包含输入的整数 xx,后跟“ converts to ”(不含引号),后跟转换后的整数。
说明/提示
【样例解释】
123456789_{10}=([00000111][01011011][11001101][00010101])_2123456789
10
=([00000111][01011011][11001101][00010101])
2
。
使用小端机存储时,如果内存存储起始地址为 0x5200x520,则从低位地址到高位地址存储的内容依次为
[00010101]_{0x520}[11001101]_{0x521}[01011011]_{0x522}[00000111]_{0x523}[00010101]
0x520
[11001101]
0x521
[01011011]
0x522
[00000111]
0x523
,
而这段内存在大端机中将被识别为
([00010101][11001101][01011011][00000111])_2=365779719_{10}([00010101][11001101][01011011][00000111])
2
=365779719
10
。
【数据范围】
对于 100\%100% 的测试点,有 -2147483648 \leq x \leq 2147483647−2147483648≤x≤2147483647。
输入输出样例
输入 #1复制
123456789
-123456789
1
16777216
20034556
输出 #1复制
123456789 converts to 365779719
-123456789 converts to -349002504
1 converts to 16777216
16777216 converts to 1
20034556 converts to -55365375
#include <bits/stdc++.h> // 引入C++标准库头文件
using namespace std; // 使用C++标准库的命名空间
int main() // 主函数
{
int n, reverse; // 定义两个整型变量n和reverse
while(~scanf("%d", &n)) { // 循环读取输入的整数n,直到输入结束
reverse = n; // 将输入的整数n赋值给reverse
char *bits = (char *)&reverse; // 将reverse的地址转换为字符指针类型,并赋值给bits
swap(bits[0], bits[3]); // 交换bits的第0个和第3个字节
swap(bits[1], bits[2]); // 交换bits的第1个和第2个字节
printf("%d converts to %d", n, reverse); // 输出转换前后的整数
}
return 0; // 程序正常结束,返回0
}