有符号类型到无符号类型的转换

1. 背景:

今天在测试前人同事的代码过程中,发现设备在零度以下就无法识别温度,原因是在无符号数据类型unsigned short和short之间转换出问题了,特别是当short为负数的时候给unsigned short赋值的时候需要特别注意。记录一下,无符号转有符号,小字节类型转大字节类型的简单规律,以后尽量避免出现这样的问题,太复杂的解说,今天记住了,时间长了也记不住。

2. 规律:

2.1. 在C语言中,负数的存储方式是通过补码(Two’s Complement)的形式来存储的。这是因为计算机硬件通常使用补码来进行算术运算。
补码的规则是:
正数的补码与原码相同。负数的补码是其绝对值的二进制形式,符号位为1,其余位为反码后加1。
例如,如果我们有一个8位的char类型变量,要存储-1,我们先取1的绝对值,得到00000001,然后取反码,得到11111110,最后加1得到11111111。这就是-1在8位char类型中的存储形式。

2.2. 在C语言中,char类型是一个字节大小的有符号整数类型,赋值给unsigned char类型的时候,就是内存数值的拷贝。
char a = -1;
unsigned char b = 0
b =a;
这个时候b就是0xff也就是255.
char 类型的变量赋值给unsigned int 类型的变量的时候,unsigned int通常是两个或四个字节大小的无符号整数类型,实际上发生的是一个隐式类型转换这意味着char类型的值会被提升为int类型,然后再赋值给unsigned int类型。
在这个过程中,如果char类型的值是非负的,那么转换是安全的,因为char能够表示的正数范围是包含在int和unsigned int之内的。但如果char类型的值是负的,那么在转换成int类型后,再将int类型的值通过内存拷贝(数据在内存怎么存储的,就直接拷贝到变量的存储空间中)给unsigned int.
不会出现
char a= -1;
unsigned int b = 0;
b = a;
b的值是0xff也就是255这样的情况,而是b的值是0xffff ffff.

3. 实例

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

int main()
{
    char type_char_value = -1;
    unsigned char type_unchar_value = 1;
    unsigned int type_int_value = 1;

    printf("d char:%d, unchar:%d, unint:%d\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("u char:%u, unchar:%u, unint:%u\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("x char:%x, unchar:%x, unint:%x\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("=================================================================\r\n");

    type_unchar_value = type_char_value;
    type_int_value = type_char_value;
    printf("d char:%d, unchar:%d, unint:%d\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("u char:%u, unchar:%u, unint:%u\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("x char:%x, unchar:%x, unint:%x\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("=================================================================\r\n");

    type_unchar_value = (unsigned char)type_char_value;
    type_int_value = (unsigned int)type_char_value;
    printf("xd char:%d, unchar:%d, unint:%d\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("xu char:%u, unchar:%u, unint:%u\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("xx char:%x, unchar:%x, unint:%x\r\n", type_char_value, type_unchar_value, type_int_value);
    printf("=================================================================\r\n");

    return 0;
}

4 .结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值