文章插图
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 1111 1111 1111二进制数值 , 表示为-1这个数值 。
下面来讲解一个应用实例 , 在网络通信或者串口通信的过程中 , 传输的数据是一个一个字节的数据流 。例如 , 一个字节的数据是128(十六进制是0x80) , 对应是二进制是1000 0000 , 那么 , 就应该把这个数据当作“无符号”数看待 , 这样 , 一个字节中的8位数据才完全做为数值位 , 才表示128这个数值 。
如果把128这个数值作为“有符号”数看待 , 那么 , 最高位作为符号位 , 剩下的7位作为数值位 , 那么 , 128这个数值当作有符号数看待时 , 其数值就发生了改变 。测试例子如下:
程序运行结果如下:
可以看到 , 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 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 正确的跑步机跑步技巧
- 各种车标志图片及名字 世界名车车标大全
- 各种长跑的小技巧
- 朋友圈简短好句子 适合各种心情的日常说说
- 常见的经营许可证类型 经营许可证有哪些
- 教师节语言唯美的句子 赞美老师的节日祝福语
- 面向过程和面向对象的区别 面向过程语言有哪几种
- string类型转日期类型 sqlserver字符串转日期格式
- c语言三种排序方法 c语言选择排序法代码
- 哪种类型的夫妻更幸福美满