有符号数的符号位扩展

       char和int类型都是由符号数类型,char类型的变量占据1个字节的容量,int类型的变量占据4个字节的容量。那么,把char类型变量赋给int类型变量,会有什么问题产生?

       我们会很直观地认为,把1个字节大小的数据,放入4个字节大小的容量,没有任何问题啊!我们做如下的一个测试例子:

#include <stdio.h>            //包含头文件, 为了使用printf()函数;

int main()                           //定义程序的主函数, 就是程序的入口地址;

{                                        //主函数的开始标记;

       char a = 255;              //定义char类型变量, 并给变量设置初始值255;

       int b = a;                     //a变量的值赋给b变量;

       printf("a = %d, b = %d\n", a, b);

       return 0;                      //返回结束状态;

}                                        //主函数的结束标记;

 

       程序运行结果如下:

mylinux@ubuntu:~/src/test$ gcc test.c -o exe

mylinux@ubuntu:~/src/test$ ./exe

a = -1, b = -1

       可以看到b的结果也是-1,这是因为,把char类型变量赋值给放入int类型变量时,是把char类型变量的数据放入int类型变量的第字节,剩下的高位字节使用char类型变量的符号位扩展填充。所以,a变量的二进制是 1111 1111,其中符号位是1,那么,放入int类型变量的时候,把a变量的 1111 1111 数据放入int类型变量的低字节,高字节使用符号位1扩展填充,最终是1111 1111 1111 1111 1111 1111 1111 1111二进制数值,表示为-1这个数值。

       下面来讲解一个应用实例,在网络通信或者串口通信的过程中,传输的数据是一个一个字节的数据流。例如,一个字节的数据是128(十六进制是0x80),对应是二进制是1000 0000,那么,就应该把这个数据当作“无符号”数看待,这样,一个字节中的8位数据才完全做为数值位,才表示128这个数值。

       如果把128这个数值作为“有符号”数看待,那么,最高位作为符号位,剩下的7位作为数值位,那么,128这个数值当作有符号数看待时,其数值就发生了改变。测试例子如下:

#include <stdio.h>            //包含头文件, 为了使用printf()函数;

int main()                           //定义程序的主函数, 就是程序的入口地址;

{                                        //主函数的开始标记;

 

       char x = 0x80;     //定义char类型变量x,并给其赋值0x80(十六进制表示)

       printf("x = %x \n", x);

       printf("x = %x \n", (unsigned char)x);

      

       return 0;                      //返回结束状态;

}                                        //主函数的结束标记;

 

       程序运行结果如下:

mylinux@ubuntu:~/src/test$ gcc test.c -o exe

mylinux@ubuntu:~/src/test$ ./exe

x = ffffff80

x = 80

       可以看到,char类型是“有符号数”类型,那么,存储在char类型变量x中的数据当作“有符号数”看到。所以,128数值存储在1个字节中的二进制是1000 0000,当以十六进制输出%x的时候,默认输出4个字节的宽度,所以,1000 0000中的符号位向高位扩展,扩展到4个字节的空间。所以,得到4个字节中的二进制数据是:1111 1111 1111 1111 1111 1111 1000 000,表示是十六进制就是0xffffff80;

       在第二行输出中,对变量x的输出,强制转换为无符号类型,那么,就把变量x当作无符号数看待,就输出其数值0x80。

更多的交流可以加QQ:1523520001,微信:13926572996,备注:linux编程;
学习、分享更多的linux C/C++ 编程知识。

展开阅读全文

没有更多推荐了,返回首页