读书笔记-数据类型的转换

计算机不会区分数据的符号性,符号性的差异仅由计算机指令如何使用数据而定。比如在 C 语言中,当对某类型变量进行强制类型转换时,其底层存储的数据并不会发生实质的变化,而仅是程序对如何解读这部分数据的方式发生了改变。比如下面这个例子:

1 #include <stdio.h>
2 int main(void) {
3   signed char x = -10;
4   unsigned char y = (unsigned char)x;
5   printf("%d\n", y);  // output: 246.
6   return 0;
7 }

其中,有符号整型变量 x 会按照位模式 1111 0110 的补码形式存放有符号数 -10,而如果将该序列按照无符号整数的位模式进行解读,则可得到如程序运行输出一样的结果,即无符号整数值 246。 总之,程序在进行强制类型转换时,不会影响其底层数据的实际存储方式。

 

在 C 语言中,关于数据使用还有一个值得注意的问题:变量类型的隐式转换(Implicit Type Conversion)。C 语言作为一种相对而言的“弱类型”语言,其一大特征就是在某些特殊情况下,变量的实际类型会发生隐式转换。在下面这个例子中,定义的两个变量 x 与 y 分别为有符号整数和无符号整数,且变量 x 的值明显小于变量 y,但程序在实际运行时却会进入到 x >= y 的分支中,这就是因为发生了变量类型的隐式转换。

 1 #include <stdio.h>
 2 int main(void) {
 3   int x = -10;
 4   unsigned int y = 1;
 5   if (x < y) {
 6     printf("x is smaller than y.");
 7   } else {
 8     printf("x is bigger than y.");   // this branch is picked!
 9   }
10   return 0;
11 }

实际上,在上面的代码中,程序逻辑在真正进入到条件语句之前,变量 x 的类型会首先被隐式转换为 unsigned int ,即无符号整型。而根据数据类型的解释规则,原先存放有 -10 补码的位模式会被解释为一个十分庞大的正整数,而这个数则远远大于 1。

 

posted @ 2023-01-07 10:14  Ben002  阅读(26)  评论(0编辑  收藏  举报