赞
踩
C 语言中定点整数是使用补码存储的
无符号数和有符号数强制类型转换,不改变数据内容,改变解释形式
例如数字 -4321
其在计算机中存储形式为补码 1110 1111 0001 1111
,当将其解释为无符号数时就是数字 61215
程序验证
int main(int argc, char *argv[])
{
short x = -4321; /* 占用 2 个字节 */
unsigned short y = (unsigned short)x;
printf("%d %d\r\n", x, y); /* -4321 61215 */
return 0;
}
长整数变短整数,高位截断,低位保留
程序验证
int main(int argc, char *argv[])
{
int a = 165537; /* int 占用 4 个字节 0x000286a1 */
int b = -34991; /* int 占用 4 个字节 0xffff7751 */
short c = (short)a; /* short 占用 2 个字节 0x86a1 */
short d = (short)b; /* short 占用 2 个字节 0x7751 */
/* 可以对 short 类型使用 h 前缀 */
printf("0x%08x 0x%08x 0x%04hx 0x%04hx\r\n", a, b, c, d); /* 0x000286a1 0xffff7751 0x86a1 0x7751 */
printf("%d %d %hd %hd\r\n", a, b, c, d); /* 165537 -34991 -31071 30545 */
return 0;
}
短整数变长整数,符号扩展
-4321
补码为:1110 1111 0001 1111
即 0xef1f
,对其进行符号扩展的补码为 1111 1111 1111 1111 1110 1111 0001 1111
即 0xffffef1f
程序验证
int main(int argc, char *argv[])
{
short a = -4321; /* 补码:1110 1111 0001 1111 */
int m = a; /* 补码:1111 1111 1111 1111 1110 1111 0001 1111 */
printf("0x%04hx 0x%08x\r\n", a, m);
printf("%d %d\r\n", a, m);
unsigned short n = (unsigned short)a; /* 补码:1110 1111 0001 1111 的真值为 61215 */
unsigned int p = n; /* p 的 补码为 0000 0000 0000 0000 1110 1111 0001 1111 */
printf("0x%04hx 0x%08x\r\n", n, p); /* 0xef1f 0x0000ef1f */
printf("%d %d\r\n", n, p); /* 61215 61215 */
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。