而char int类型都是有符号数类型,char类型的变量占用1字节容量,int类型的变量占用4字节容量。那么,将char类型变量赋给int类型变量会出现什么问题呢?
我们会直观的认为把1字节的数据放入4字节的容量是没有问题的!让我们做下面的测试例子:
程序运行结果如下:
可以看出,B的结果也是-1。这是因为,当把一个char变量赋给int变量时,char变量的数据放入int变量的字节中,剩下的高位字节用char变量的符号位扩展填充。因此,变量A的二进制数是1111 1111,其中符号位是1。然后在放入一个int类型变量时,变量A的1111 1111数据放入int类型变量的低位字节,高位字节扩展填充符号位1,最后是1111 1111 1111 1111 1111的二进制数,表示为-1。
我们来解释一个应用实例。在网络通信或串行通信过程中,传输的数据是逐字节的数据流。例如,一个字节的数据是128(十六进制的0x80),相当于二进制的1000 0000。然后,这个数据应该被当作一个“无符号”数,这样一个字节中的8位数据就可以完全作为一个数值位来表示128的值。
如果将128的值视为“有符号”数,那么最高位视为有符号位,其余7位视为数值位,那么128的值在视为有符号数时会发生变化。测试示例如下:
程序运行结果如下:
可以看出,char类型是“有符号数”类型,所以char类型变量x中存储的数据被当作“有符号数”。所以1个字节存储的128个值的二进制数是1000 0000,十六进制输出%x时,默认输出4个字节的宽度。所以1000 0000中的符号位扩展到高阶,扩展到4字节的空。所以四个字节中的二进制数据是:111111111111111111110000,也就是说是十六进制或者0xffffff80;
在第二行输出中,变量X的输出被强制为无符号,因此变量X被视为无符号数,其值0x80被输出。
本文来自MR.特别人士投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/620588.html