有关于变量类型的隐含问题
来源:互联网 发布:网络直播的现状 编辑:程序博客网 时间:2024/05/16 18:13
在C编程的时候,经常遇到类型转换(强制类型转换和隐式类型转换)问题,比如无符号整型到短整型转换(位截断),无符号短整型到有符号整型的转换(位扩展)。如果不了解类型转换的内在原理,写好的代码可能会出现意想不到的问题。类型转换如果从变量的字节数量上来看,可以分为2类,位扩展和位截断:
1)位扩展
位扩展,通俗点表达就是字节少的变量转换为字节多的变量,比如short到int的转换。方法如下:
(1)有/无符号的待扩展变量到有/无符号目的变量转换
如果待扩展变量是有符号的,则用符号位进行填充,使得待扩展变量的字节长度与目标变量字节长度一致。然后,进行符号变换(如果待扩展变量与目的变量都是有符号,则不需要转换)。
如果待扩展变量是无符号的,则用符号“0”进行填充,使得待扩展变量的字节长度与目标变量字节长度一致。然后,进行符号变换(如果待扩展变量与目的变量都是无符号,则不需转换)。
short x = -12345;unsigned ux = x;// ux = ?unsigned short y = 12345;int sy = y; // sy = ?
有符号变量x是待扩展变量,无符号变量ux为目的变量。无符号变量y为待扩展变量,有符号变量sy为目的变量。
16位的x首先进行位扩展,扩展到32位后的16进制表示:0xffffcfc7。然后进行符号位变换,那么此时ux表示的值是无符号的(4294967296 - 12345 = 4294954951)
16位的y首先进行位扩展,扩展到32位后的16进制表示:0x00003039。然后进行符号位变换,那么此时sy表示的值是有符号的(12345 - 4294967296 = -4294954951)
2)位截断
(1)有/无符号的待截断变量到有/无符号目的变量的转换
将待截断变量先进行无符号变换(有符号的截断变量需要符号变换,而无符号变量则不需要)。如果目的变量的bit位数是k,而待截断变量的bit位数是w,则将无符号变换得到的无符号数对2^k取模运算,并将得到的无符号结果进行符号变换(如果目的变量是无符号的则不需要)。
int x = -12345;short sx = (short)x; // sx = ?
在此例中,x的16进制表示为:0xffffcfc7,经过无符号变换后表示的数据为4294954951,该数据经过截断后表示的数据为0xcfc7,0xcfc7经过符号变换后得到数据-12345。看另外一个例子
int x = 53191;short sx = (short)x; // sx = ?
x转换为4294967296+53191的无符号整数,取模2^16,得到53191的无符号的整数,进行有符号变换,得到52191-65536= -12345的有符号数。
- 有关于变量类型的隐含问题
- 隐含类型局部变量
- 有关于sln 类型文件的 unrecognized version 问题
- 有关于oracle的问题!
- 有关于预处理的问题
- C#隐含类型局部变量
- 有关于Mysql的MERGE表类型
- make 的隐含规则和隐含变量
- 有关于虚函数的问题
- 有关于RTX本地缓存的问题
- 有关于txtsetup.sif 错误的问题
- jsp中有关于超链接的问题
- 有关于Vector对象的问题
- php有关于路径的问题分析
- oracle中有关于字符串的问题。
- 有关于tomcat的乱码问题
- 有关于指针函数的问题
- 有关于JAVAEE乱码问题的总结
- css定位
- java中为什么需要接口
- 日报2015/10/28(极客学院安卓视频学习)
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
- 《Effective Java》中推荐的hashCode算法
- 有关于变量类型的隐含问题
- 关于启动页面
- 欢迎使用CSDN-markdown编辑器
- 如何成为更高级别的iOS开发工程师?
- linux---sz命令
- CSS3弹性布局的使用
- php exec传参数问题
- Java Swing模拟按键事件
- MBTextFieldWithInputValidator 诞生记