任务描述
对于输入的按int型、float型、double型、char型数组这四种数据类型存储的数据,分别将该数据按正常形式输出以及按字节以十六进制形式输出。十六进制的字母请用大写的A,B,C,D,E,F。其中,int型、float型、double型数据按先输出高位字节,从高位字节向低位字节输出的形式。字符串型则直接按字符顺序逐字节输出。
输入
有4行,第1行是一个整数,以int型数据存储。第2行是一个带小数点的实数,以double型存储,第2行是一个带小数点的实数,以double型存储,第3行是长度为不超过100字符的英文字符串,以char型数组存储。
输出
输出4组结果每组输出2行。
第1组:第1行输出int型整数本身,第2行按字节输出该int型数据4组十六进制值。
第2组:第1行输出float型实数本身,第2行按字节输出该实数的4组十六进制值。
第3组:第1行输出double型实数本身,第2行按字节输出该实数的8组十六进制值。
第4组:第1行输出字符串本身,第2行按字节输出该字符串的每个字符的十六进制值。
每组数据的2行输出之后有空行。每两个十六进制值之间用空格分隔。
输入举例
123456
123.456
123.456
123456 and 123.456 is a number!
输出举例
123456
00 01 E2 40
123.456001
42 F6 E9 79
123.456000
40 5E DD 2F 1A 9F BE 77
123456 and 123.456 is a number!
31 32 33 34 35 36 20 61 6E 64 20 31 32 33 2E 34 35 36 20 73 20 61 20 6E 75 6D 62 65 72 21
#include "stdio.h"
#include "string.h"
int islittle()
{
int i = 1;
return i == (int)*((char *)&i);
}
#define LITTLEENDIAN islittle()
void printbytes(void * ptr, size_t size, int rev = 0)
{
int start = 0;
int end = size;
int step = 1;
if (rev)
{
start = size - 1;
end = -1;
step = -1;
}
for (int i = start; i != end; i += step)
{
int val = ((unsigned char *)ptr)[i];
char out[3];
if (val / 16 > 9) out[0] = val / 16 + 'A' - 10; else out[0] = val / 16 + '0';
if (val % 16 > 9) out[1] = val % 16 + 'A' - 10; else out[1] = val % 16 + '0';
out[2] = '\0';
printf("%s ", out);
}
printf("\n");
}
int main()
{
int a;
float b;
double c;
char d[101];
scanf_s("%d", &a);
scanf_s("%f", &b);
scanf_s("%lf", &c);
fflush(stdin);
scanf_s("%[^\n]", &d[0], 100);
printf("%d\n", a);
printbytes((void *)&a, sizeof(int), LITTLEENDIAN);
printf("%f\n", b);
printbytes((void *)&b, sizeof(float), LITTLEENDIAN);
printf("%lf\n", c);
printbytes((void *)&c, sizeof(double), LITTLEENDIAN);
fflush(stdin);
printf("%s\n", d);
printbytes((void *)&d[0], sizeof(char) * strlen(d), 0);
return 0;
}