类型转换是将变量从一种类型转换为另一种数据类型。下面这篇文章主要介绍C语言类型转换的相关信息。通过示例代码详细介绍,有需要的朋友可以参考一下。
目录
整形unsigned到signed到unsigned之间的强制转换截断的摘要整形和浮点数在不同长度的数字转换中的强制类型转换
整形之间的强制转换
在造型类型转换中,我们通常使用塑料造型来造型无符号和有符号类型。所以首先要介绍一下数字在计算机中的存储方式。计算机通常以补码的形式存储数据。以8位数据为例。二进制数和有符号数之间的对应关系是:
012…127-128-127…-10000 00000000 00010000 0010…0111 11111000 00001000 0001…1111 1111
无符号转有符号
012…127128129…2550000 00000000 00010000 0010…0111 11111000 00001000 0001…1111 1111
所以,对于有符号的数字,最高位首先是正负符号位。当一个无符号数被强制转换为有符号数时,其内存中的二进制不会发生变化,只是我们对它的解读发生了变化,即无符号数128被强制转换为有符号数,即-128。
当然,这种扩展的一个优点是对有符号数的判断,例如
char a;
.
如果((a=0)(a80))
{
.
}
可以使用强制转换,省去一个判断条件。
char a;
.
if((unsigned char)a)80)
{
.
}
有符号转无符号
有符号数换成无符号数,情况也差不多。例如,8位有符号数120到无符号数是120,但8位1到无符号数是255。所以当我们要在有符号数的计算中保持数大于等于0时,通过强制转换是做不到的,所以我们要做一个判断:
char a,b,d;
无符号字符c;
.
c=(无符号字符)(a b);():当运算结果小于0时,C会异常,变成一个超级大数。
d=a b;
c=(d0)?0:d;()
不同长度数字转化中的截断
例如,如果我有一个8位有符号数-1要转换成16位有符号数,那么结果仍然是-1。首先要明确一点,8位有符号数-1的二进制原虽然是1111 1111,但是在加载到32位cpu进行运算时,会转换成32位有符号数进行运算,也就是int类型的-1。因此,对于char数据,即使运算结果超出此类型,实际上也不会出现异常:
char a=127,b=127,c=127,e;
int d;
.
e=a b c;():当运算结果超出存储类型的表示范围时,截断会导致错误。
d=a b c;():32位int类型足以存储结果。
因此,如果我们对不同长度的数字进行类型转换,只有两个步骤:
1.将这个数表示为32位。
2.将32位数截断为结果类型。
但是,有一点是肯定的:执行第一步时,数字的值不会改变:
例如,8位有符号数-1(1111 1111)将被转换为32位-1(1111 1111 1111 1111 … 1111 111)。
当8位无符号数255 (1111111)改为32位时,仍然是255: (0000 0000 … 0000 0000 1111)。
但在第二步转换中,数值会因截断而发生变化,这种截断一般是高阶截断(舍弃高阶位,保留低阶位):
例如,当int类型的255(0000 0000 … 0000 0000 1111 1111)转换为8的无符号char类型时,前面的0将被截断,只留下较低的8位,即255(1111 1111)。当然,如果转换成有符号的char类型8,那么就是-1 (1111 111)。截断是二进制级别的位截断,与实际值无关。
整形与浮点数的强制类型转换
众所周知,浮点数一般遵循ieee754标准,有符号位、顺序码和尾数:
和整形一样,符号位1代表负数,符号位0代表正数。而顺序码表示小数点在哪里,类似于科学计数法100,会表示为1.010 ^ 2。这里就不介绍细节了,我们重点说一下强制转型:
对于int类型的数,只要在浮点数的范围内,就可以正确地转换成浮点数。
但是,对于浮点数,当它转换为整数时,将只保留整数位,例如:
int a=(int)0.1;也就是说,a=0
int a=(int)1.1;也就是说,a=1
int a=(int)1.5;也就是说,a=1
int a=(int)-1.5;A=-1
所以如果要四舍五入之类的,不能靠强制转换,得用相关函数。当然,如果转换成其他整形,结果会被32位整形结果截断。
当然cast的功能和floor差不多。楼层功能的作用是向下舍入:
int a=floorf(0.1);也就是说,a=0
int a=floorf(1.1);也就是说,a=1
int a=floorf(1.5);也就是说,a=1
对于大于0的浮点数,其实是可以替换的,但小于0时,就大不一样了:
int a=floorf(-0.1);A=-1
int a=floorf(-1.1);A=-2
int a=(int)-0.1;也就是说,a=0
int a=(int)-1.1;A=-1
强制转换的结果,会产生正负0的概念。比如从-0.9到0.9,强制变换结果都是0。当使用cast时,将生成越界输出。
总结
这就是本文关于C语言强制类型转换的规则。有关C语言强制类型转换的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。