C 语言整数强制类型转换

C 语言强制类型转换

注意

C 语言中定点整数是使用补码存储的

无符号数和有符号数强制类型转换

无符号数和有符号数强制类型转换,不改变数据内容,改变解释形式

例如数字 -4321

  • 原码:1001 0000 1110 0001 (最高位为符号位 1:负数,0:正数)
  • 反码:1110 1111 0001 1110 (除符号位外各个位取反)
  • 补码:1110 1111 0001 1111 (反码加一)

其在计算机中存储形式为补码 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 11110xef1f,对其进行符号扩展的补码为 1111 1111 1111 1111 1110 1111 0001 11110xffffef1f

程序验证

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值