计算机不会区分数据的符号性,符号性的差异仅由计算机指令如何使用数据而定。比如在 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。
标签:10,转换,变量,符号,int,读书笔记,数据类型,unsigned,隐式 From: https://www.cnblogs.com/ben002/p/17032186.html