C语言uint16_t存储负数的那些坑:为什么你的-1变成了65535?

C语言uint16_t存储负数的陷阱:从二进制补码到类型提升的深度解析

1. 问题现象:为什么-1变成了65535?

在嵌入式开发中,我遇到过这样一个令人困惑的场景:当尝试用uint16_t类型存储一个int类型的负数时,读取出来的值竟然变成了65535。比如下面这段代码:

#include <stdio.h>
#include <stdint.h>

int main() {
    int value = -1;
    uint16_t unsigned_value = (uint16_t)value;
    printf("The unsigned value is: %u\n", unsigned_value);  // 输出65535
    return 0;
}

这个现象看似违反直觉,但背后隐藏着C语言类型系统和二进制表示的深层原理。要理解这个问题,我们需要从计算机如何表示负数开始讲起。

2. 补码:计算机表示负数的秘密

现代计算机系统普遍采用二进制补码(Two's Complement)来表示有符号整数。这种表示方法有三个关键特点:

  1. 最高位为符号位:0表示正数,1表示负数
  2. 正数的补码与原码相同
  3. 负数的补码是其绝对值的原码取反后加1

让我们以16位整数为例:

数值 二进制表示(16位)
1 00000000 00000001
-1 11111111 11111111
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值