重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include#include "headfile.h"
int main (){short x = 12345;
short mx = -x;
show_bytes((byte_pointer)&x, sizeof(short));
show_bytes((byte_pointer)&mx, sizeof(short));
return 0;
}
有符号数和无符号数之间的转换#includeint main(){short int v=-12345;
unsigned short uv=(unsigned)v;
printf("v=%d,uv=%u\n",v,uv);
return 0;
}
该代码输出结果为v=-12345,uv=53191
由此可见,强制类型转换不会改变原数的位值,只是改变了解释这些位的方式。
int tx, ty;
unsigned ux, uy;
tx = (int)ux;
uy = (unsigned)ty;
int tx,ty;
unsigned int ux,uy;
tx=ux;//cast to signed
uy=ty;//cast to unsigned
int x=-1;
unsigned u=2147483648;
printf("x = %u = %d\n",x);
printf("u = %u = %d\n",u);
当其在32位机器上运行时,输出为short sx = -12345; //补码数的符号扩展
unsigned short usx = sx;
int x = sx;
unsigned ux = usx;
printf("sx = %d:\t", sx);
show_bytes((byte_pointer)&sx, sizeof(short));
printf("usx = %u:\t", usx);
show_bytes((byte_pointer)&usx, sizeof(short));
printf("x = %d:\t", x);
show_bytes((byte_pointer)&x, sizeof(short));
printf("ux = %u:\t", ux);
show_bytes((byte_pointer)&ux, sizeof(short));
这段代码打印如下输出
sx = -12345: c7cf
usx = 53191: c7cf
x = -12345: ffffc7cf
ux = 53191: 0000c7cf
unsigned uy = sx; //数据类型转换的顺序对程序的影响
printf("uy = %u:\t", uy);
show_bytes((byte_pointer)&uy, sizeof(unsigned));
其输出为
uy = 4294954951: c7cfffff
这表明在将short转换为unsigned时,我们要先改变大小,之后再完成从有符号到无符号的转换,即(unsigned)sx等价于(unsigned)(int)sx。
同样的
int func1(unsigned word) //练习题2.23
{return (int)((word<< 48) >>248);
}
int func2(unsigned word)
{return ((int)word<< 48) >>48;
}
unsigned w = 0x87654321;
printf("%d\n", func1(w));
printf("%d\n", func2(w));
这段代码的输出为
67
17185
int x = 53191;
short sx = (short)x;
int y = sx;
当我们把x强制类型转换为short时,我们就将32位的int截断为了16位的short int。此时这个16位的位模式就是-12345的补码表示。当我们把它强制类型转换回int时符号扩展把高16位设置为1,从而生成-12345的32位补码表示。
(先缩小(溢出),后补位)
float sum_elements(float a[],unsigned length){int i;
float result=0;
for (i = 0; i<= length-1; i++)
{result+=a[i];
}
return result;
}
其中当参数length为0时,会导致for中length-1为4294967295,而a[]并没有这么多位,因此导致内存错误。
又如下
当两字符串长度之差大于int可表示的大正数时,返回值发生溢出变为负值,此时函数运算的结果是错误的,而将该函数定义为unsigned int的话,便可以规避掉这一问题。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧