将类型转换理解为编译器
让我们从几行 C 开始讨论——
C
#include
int main() {
int x = 97;
char ch = x;
printf("The value of %d in character form is '%c'",x, ch);
return 0;
}
C
#include
int main() {
int x = 321; //can be written as 256+65
char ch = x;
printf("The character form of %d is '%c'",x,ch);
return 0;
}
C
#include
int main() {
int x = 57;
char ch = x;
printf("The character form of %d is '%c'",x,ch);
return 0;
}
输出 :
The value of 97 in character form is 'a'
让我们了解编译器将如何编译该程序中的每条指令。
编译器:
- 进入主程序
- 分配 4 个字节的内存(整数一般占用 4 个字节),将其命名为x ,并赋予其值为 97
- 分配 1 字节内存(因为一个字符占用 1 字节空间),命名为ch ,其中存储了x对应的值
- 打印出ch的值
- 退出主程序
我们将彻底理解 2 和 3 点,因为所有其他点都很明显。
第二点说明:
当内存以二进制形式存储数据时,编译器会将97 (十进制)转换为其相应的二进制形式。 00000000 00000000 00000000 01100001是97在 4 字节(或 32 位)二进制表示中的二进制表示。所以变量x的内容将与给定图像中的内容一样 -
这种在内存中以二进制形式表示数据的系统称为大端,但在大多数计算机系统中,尽管有这种系统,但仍遵循小端系统。所以在小端系统中 x 的内容如下 -
因此,在大多数计算机中,内存中的每个数据都将仅以 Little-Endian 形式存储。
第二点说明:
如前所述,字符在内存中占用 1 字节或 8 位空间,因此编译器将分配它,但是当将值分配给变量ch时,它将进入x存在的位置并开始读取内容只有第一个字节,因为它正在读取一个字符。所以第一个字节有二进制形式的0110 0001 ,其对应的十进制形式是97。每个字符都有一些与之相关的ASCII码,字符a的ASCII码是97。这就是为什么ch的内容会变成a和之后那,编译器将简单地打印ch 的内容。
更多示例以便更好地理解:
C
#include
int main() {
int x = 321; //can be written as 256+65
char ch = x;
printf("The character form of %d is '%c'",x,ch);
return 0;
}
输出 :
The character form of 321 is 'A'
解释 :
321 的二进制表示是00000000 00000000 00000001 01000001和x在 Little Endian 系统中的内容是0100001 00000001 00000000 00000000简单地做 1234 ⇢ 4321 (见图)得到这种形式。现在编译器只查看第一个字节,即0100001 ,其对应的十进制形式是 65,它是字符'a'的 ASCII 码。
C
#include
int main() {
int x = 57;
char ch = x;
printf("The character form of %d is '%c'",x,ch);
return 0;
}
输出 :
The character form of 57 is '9'
解释 :
57 的二进制表示为00000000 00000000 00000000 00111001 , x在 Little Endian 系统中的内容为00111001 00000000 00000000 00000000现在编译器只查看第一个字节,即00111001 ,其对应的十进制形式为 57,即 ASCII 码字符'9'。
很高兴有 :
- AZ 的 ASCII 码是 65-90,az 是 97-122,0 到 9 的数字也有其对应的 48 到 57 的 ASCII 码。
- 要找到对应的字符形式,只需找到该数字与 256 的模数,然后查找 ASCII 表并找到与余数对应的字符。那将是你的答案。
谢谢^_^