📜  将类型转换理解为编译器

📅  最后修改于: 2022-05-13 01:57:03.472000             🧑  作者: Mango

将类型转换理解为编译器

让我们从几行 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'

让我们了解编译器将如何编译该程序中的每条指令。

编译器:

  1. 进入主程序
  2. 分配 4 个字节的内存(整数一般占用 4 个字节),将其命名为x ,并赋予其值为 97
  3. 分配 1 字节内存(因为一个字符占用 1 字节空间),命名为ch ,其中存储了x对应的值
  4. 打印出ch的值
  5. 退出主程序

我们将彻底理解 2 和 3 点,因为所有其他点都很明显。

第二点说明:

当内存以二进制形式存储数据时,编译器会将97 (十进制)转换为其相应的二进制形式。 00000000 00000000 00000000 0110000197在 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 01000001x在 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 00111001x在 Little Endian 系统中的内容为00111001 00000000 00000000 00000000现在编译器只查看第一个字节,即00111001 ,其对应的十进制形式为 57,即 ASCII 码字符'9'。

很高兴有 :

  1. AZ 的 ASCII 码是 65-90,az 是 97-122,0 到 9 的数字也有其对应的 48 到 57 的 ASCII 码。
  2. 要找到对应的字符形式,只需找到该数字与 256 的模数,然后查找 ASCII 表并找到与余数对应的字符。那将是你的答案。

谢谢^_^