c语言int,unsigned char, bit之间转换

这段代码展示了如何在C语言中使用位操作将8位无符号整数(Data)转换为二进制表示(n[]),以及如何将二进制数组(n[])转换回原数值(Data)。程序包括两种不同的转换方法,并在main函数中对几个示例进行了测试。
#include <stdio.h>
#include <string.h>
#include <stdint.h>

void itob(uint8_t Data)
{
    uint8_t n[8]={0};

    //方法1:
    n[0] = (Data & 0x01) == 0x01 ? 1 : 0;
    n[1] = (Data & 0x02) == 0x02 ? 1 : 0;
    n[2] = (Data & 0x04) == 0x04 ? 1 : 0;
    n[3] = (Data & 0x08) == 0x08 ? 1 : 0;
    n[4] = (Data & 0x10) == 0x10 ? 1 : 0;
    n[5] = (Data & 0x20) == 0x20 ? 1 : 0;
    n[6] = (Data & 0x40) == 0x40 ? 1 : 0;
    n[7] = (Data & 0x80) == 0x80 ? 1 : 0;
    printf("1 - %u : (%u %u %u %u %u %u %u %u)\n", Data, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);

    //方法2:
    int i;
    memset(n, 0, 8);
    for(i=0;i<8;i++)
    {
        n[i] = (Data & (0x01<<i)) == (0x01<<i) ? 1 : 0;
    }
    printf("2 - %u : (%u %u %u %u %u %u %u %u)\n", Data, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
}

void btoi(uint8_t n[8])
{
    uint8_t	Data = 0x00;
    //方法1:
    Data = n[0]|(n[1]<<1)|(n[2]<<2)|(n[3]<<3)|(n[4]<<4)|(n[5]<<5)|(n[6]<<6)|(n[7]<<7);

    printf("1 - %u : (%u, %u, %u, %u, %u, %u, %u, %u)\n", Data, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);

    //方法2:
    int i;
    for(i=0;i<8;i++)
    {
        Data |= n[i]<<i;	
    }
    printf("2 - %u : (%u, %u, %u, %u, %u, %u, %u, %u)\n", Data, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
}
int main (void)
{
    //  12 : (0 0 1 1 0 0 0 0) 
    //  20 , (0 0 1 0 1 0 0 0) 
    //   4 : (0 0 1 0 0 0 0 0) 
    uint8_t	Data = 0x12;

    itob(0xc);
    itob(0x14);
    itob(0x4);
    
    // uint8_t n[8]={0,1,0,0,1,0,1,0};

    
    return 0;
}

int >> unsigned char >> bit

int num = get_val();
    if (num < 0)
    {
        wy_log("!!!read val  failed with %d", num);
        return num;
    }
    uint8_t data = num & 0xf;
    
    int i;

    memset(n, 0, 8);
    for (i = 0; i < 8; i++)
    {
        n[i] = (data & (0x01 << i)) == (0x01 << i) ? 1 : 0;
    }
    wy_log("data - %u : (%u %u %u %u %u %u %u %u)", data, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);

### C语言 `unsigned char` 的定义与用法 #### 一、`unsigned char` 的定义 在C语言中,`unsigned char` 是一种无符号字符类的数据类。它占用一个字节的存储空间,并且其取值范围为 **0 至 255**[^2]。这意味着它可以用来表示非负的小整数值或者 ASCII 编码表中的所有字符。 与其他整数类相比,`unsigned char` 不像 `int` 或者 `long` 那样默认是有符号的。对于未指定符号特性的 `char` 类,其具体行为依赖于编译器实现以及目标平台的规定——某些平台上可能将其视为有符号 (`signed char`),而在其他平台上则可能是无符号 (`unsigned char`)[^3]。 因此,在需要明确控制字符是否有符号的情况下,推荐始终显式地使用 `signed char` 或者 `unsigned char` 来代替普通的 `char` 定义方式[^2]。 #### 二、`unsigned char` 的典用途 以下是几个常见的场景下如何应用 `unsigned char`: 1. **处理大范围正整数** 当程序只需要操作介于 `[0, 255]`之间的整数值时,可以选择此类以节省内存资源并提高性能。 ```c unsigned char value = 200; ``` 2. **读写二进制文件或网络通信协议字段** 在涉及低级硬件接口编程或是跨设备传输数据的过程中,经常需要用到精确大小和固定位宽的数据单元。此时采用 `unsigned char[]` 数组能够很好地满足需求。 ```c void writeBinaryData(unsigned char buffer[], size_t length); ``` 3. **图像像素颜色分量表达** 对彩色图片而言,RGB三个通道每种强度都可以通过单个 byte 表达出来 (红绿蓝各占8bit),正好对应着 `unsigned char` 所能覆盖的最大区间 [0..255]. ```c struct Pixel { unsigned char red; unsigned char green; unsigned char blue; }; ``` 4. **字符串终止标志管理** 尽管标准库函数大多接受的是常规 `char*`,但在特殊情况下也可能遇到需特别对待的情况,这时可以用到 `unsigned char`. --- ### 示例代码展示 下面给出一段简单的演示代码片段说明上述概念的应用实例: ```c #include <stdio.h> #include <limits.h> void demonstrateUnsignedChar() { // Define an unsigned character variable. unsigned char ucharValue; // Assign maximum possible value to it. ucharValue = UCHAR_MAX; printf("Maximum Value of Unsigned Char: %u\n", ucharValue); // Try assigning a negative number which will cause overflow due to modulo arithmetic behavior. ucharValue -= 256; printf("After Subtracting 256 from Max UChar (%d): Result is %u\n", UCHAR_MAX, ucharValue); } int main(){ demonstrateUnsignedChar(); return 0; } ``` 运行该程序将会显示关于 `unsigned char` 如何循环回绕特性的重要信息。 --- ### 总结 综上所述,尽管普通 `char` 是否带符号存在不确定性,但只要合理运用 `unsigned char`,就可以有效规避潜在风险同时充分利用其优势特点完成各种任务.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值