c++类型转换时的符号位扩展
来源:互联网 发布:普法网络知识竞赛 编辑:程序博客网 时间:2024/05/29 19:03
先从一到题开始:
unsigned short A = 10; printf("~A = %u\n", ~A); char c = 128; printf("c = %d\n", c);//输出是多少?
标准答案是:
~A = 4294967285
c = -128
分析:
- A是无符号短整型,占两个字节
A:0000 0000 0000 1010
将~A按照%u即无符号整型输出,需要先将A扩展到4字节,扩展结果为0000 0000 0000 0000 0000 0000 0000 1010,再求~A,为1111 1111 1111 1111 1111 1111 1111 0101即0xfffffff5,由于是无符号的,该值为4294967285 - c是char型,占一个字节
c:1000 0000
将c按%d即带符号整形输出,先将c扩展到4字节,扩展结果为1111 1111 1111 1111 1111 1111 1000 0000即0xffffff80,而该数是有符号的,并且是个负数,那么此时这个数是一个负数的补码,就要将它转换成对应的原码,转换结果为1000 0000 0000 0000 0000 0000 1000 0000即0x80000080,也就是-128
数据类型转换时,符号位的处理:
短数据类型扩展为长数据类型
要扩展的短数据类型为有符号数:
进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数值大小不变要扩展的短数据类型为无符号数:
进行零扩展,即用零来填充长数据类型的高字节位
char x = 10001001b; short y = x; //y的值应为11111111 10001001b;char x = 00001001b;short y = x; //y的值应为00000000 00001001b; unsigned char x = 10001001b; short y = x; //y的值应为00000000 10001001b;unsigned char x = 00001001b; short y = x; //y的值应为00000000 00001001b;
- 长数据类型缩减为短数据类型
如果长数据类型的高字节全为1或全为0,则会直接截取低字节赋给短数据类型;如果长数据类型的高字节不全为1或不全为0,则转换就会发生错误。
参考链接
0 0
- c++类型转换时的符号位扩展
- C语言的位域和符号位扩展
- c中符号位扩展
- 按位“或”运算符在带符号扩展操作数上使用;请考虑首先强制转换为较小的无符号类型
- 有符号数据的符号位扩展
- 类型转换中的符号扩展问题
- 类型转换和符号扩展,again!
- 有符号数转换中"符号位扩展"
- 有符号与无符号的类型转换以及数位扩展问题
- 符号位扩展问题
- C语言中有符号数和无符号数类型转换的用法深度解析
- c语言的带符号扩展和无符号扩展
- c语言的带符号扩展和无符号扩展
- 符号的技巧---注释 接续 转义 单双引 逻辑,位运算 优先级 类型转换
- 有符号类型与无符号类型之间的转换
- 64位有符号与无符号类型的整数
- 数据类型转换 符号扩展
- 符号位扩展问题总结
- 78. Subsets 【LeetCode算法之旅之深度优先搜索】
- :提高查询的效率 创建定时任务
- 华为机试-判断两个IP是否属于同一个子网
- eclipse中运行项目报错:Project xxx cannot reference itself
- 加法变乘法
- c++类型转换时的符号位扩展
- ES6——Day2(数组的解构赋值)
- android studio中Genymotion创建的模拟器无法关闭删除的问题
- FFmpeg 中文文档
- 创建存储过程
- JAVA内部类概念简介
- WIN10(GTX1050)环境Anaconda2下安装theano和keras
- 归并算法
- struts2