小甲鱼C语言学习P25[仅作记录]
·
0.4
.0 十进制转换十六进制(怎么还是没能记住【可恶呢】)
以 112358 为例,
短除法:

在内存地址中,用 0x0001B6E6 表示,0x 是十六进制的标识。
.1 小端与大端
据小甲鱼的科普,小端和大端是数据的存放形式。
大端是高位字节排放在内存低位地址;
例如整型变量0x12345678占四个字节,其存放方式为:
| 数据 | 0x12 | 0x34 | 0x56 | 0x78 |
| 地址 | 0x10000000 | 0x10000001 | 0x10000002 | 0x10000003 |
小端则相反,地位字节排放在高位地址:
| 数据 | 0x78 | 0x56 | 0x34 | 0x12 |
| 地址 | 0x10000000 | 0x10000001 | 0x10000002 | 0x10000003 |
两者各有利弊,并无绝对。
在转换类型时, int a = 0x1234 , 其存放方式为 0x12340000
那么, (long)a,则只需要在末尾补齐相应的 0 即可。
如果是大端的话, 其存放方式是 0x00001234, 则需要先后移再补齐。
但是符号位的判定固定为第一个字节,容易判断正负[doge]
1.练习:
哼哼哼,虽然写了很久,但整体思路跟小甲鱼的没什么出入!
int M1, P1, M2, P2;
printf("请输入第一个矩阵的尺寸(M * P):");
scanf("%d*%d", &P1, &M1);
printf("请输入第二个矩阵的尺寸(M * P):") ;
scanf("%d*%d", &P2, &M2);
int i, j;
int matrix1[P1][M1], matrix2[P2][M2];
int a;
printf("请输入第一个矩阵的值\n");
for (i = 0; i < P1; i++)
{
for (j = 0; j < M1; j++)
{
scanf("%d",&a);
matrix1[i][j] = a;
}
}
printf("请输入第二个矩阵的值\n");
for (i = 0; i < P2; i++)
{
for (j = 0; j < M2; j++)
{
scanf("%d",&a);
matrix2[i][j] = a;
}
}
int i1, i2, j1, j2;
int matrix3[P1][M2], sum;
for (i1 = 0; i1 < P1; i1++)
{
for (j2 = 0; j2 < M2; j2++)
{
sum = 0;
for (i2 = 0, j1 = 0; i2 < M1, j1 < P2; i2++, j1++)
{
sum += matrix1[i1][i2] * matrix2[j1][j2];
}
matrix3[i1][j2] = sum;
}
}
int max = 0, half ;
max = P1 > P2 ? P1 : P2;
half = max/2;
for ( i = 0; i < max; i++)
{
if ( i < P1)
{
printf("| ");
for (j = 0; j < M1; j++)
{
printf("%d ", matrix1[i][j] );
}
printf("| ");
}
else
{
for (j = 0; j < M1 + 2; j++)
{
printf(" ");
}
}
printf( i == half? "* ": " ");
if ( i > P2)
{
for (j = 0; j < M1 + 2; j++)
{
printf(" ");
}
}
else
{
printf("| ");
for ( j = 0; j < M2; j++)
{
printf("%d ", matrix2[i][j]);
}
printf("| ");
}
printf( i == half? "= ": " ");
if ( i < P1)
{
printf("| ");
for ( j = 0; j < M2; j++)
{
printf("%d ", matrix3[i][j]);
}
printf("| ");
}
else
{
for (j = 0; j < M2 + 2; j++)
{
printf(" ");
}
}
printf("\n");
}
不过就是写了很久........TT
更多推荐
所有评论(0)