二进制、十进制、十六进制、常用有符号整型、无符号整型知识介绍

         一个字节(byte)是计算机中最基本的数据单位之一,它的表示方式可以用不同的进制系统表示。

二进制

         一个字节由 8 位(二进制位)组成。每个位可以是 0 或 1,所以一个字节的二进制表示是一个 8 位的二进制数。例如:二进制 00000000 到 11111111

十进制

一个字节可以表示的十进制范围是 0 到 255。这是因为 8 位二进制数可以表示 28=25628=256 个不同的值,从 0 到 255。例如:十进制 0 到 255

十六进制

        一个字节在十六进制中可以表示为两个十六进制字符。每个十六进制字符表示 4 位二进制数据。因此,一个字节的十六进制表示范围是 00 到 FF。例如:十六进制 00 到 FF

        总结如下:一个字节=一个十进制数=两个十六进制字符(比如16进制 01 就是一个字节)=八个二进制数(0或者1表示)

波特率(Baud Rate)

        是数据传输速度的单位,表示每秒传输的比特数(bits per second)。在计算传输时间时,你需要知道以下几个因素:

  1. 波特率:9600 比特每秒 (bps)。
  2. 数据位(Data Bits):通常是 8 位,但有时也可能是 7 位。
  3. 停止位(Stop Bits):通常是 1 位,但有时可能是 1.5 或 2 位。
  4. 起始位(Start Bit):每个字符通常都有一个起始位。
  5. 奇偶校验位(Parity Bit):如果使用奇偶校验,会增加额外的 1 位。

        假设使用的是 8 数据位、1 停止位和没有奇偶校验位的标准设置,那么每个字符的总位数可以通过以下方式计算:

  • 起始位: 1 位
  • 数据位: 8 位
  • 停止位: 1 位

所以每个字符总共有 1+8+1=1+8+1=10 位。

然后,你可以用下面的公式计算传输时间:

传输时间(秒)= 字符总位数 × 字符数 / 波特率传输时间(秒)

对于 4 个字符:

传输时间(秒)=10 位/字符×4 字符 / 9600 位/秒≈0.00417 秒传输时间(秒)

将秒转换为毫秒:

0.00417 秒×1000 毫秒/秒=4.17 毫秒0.00417 秒×1000 毫秒/秒=4.17 毫秒

因此,传输 4 个字符在波特率为 9600 的情况下大约需要 4.17 毫秒。

        字节和字符可以说差不多对等的,但是一个字节等于8个bit位,一个字符大概有10位。一个英文字母是一个字节,一个汉字是两个字节,二进制数一个0或者1为一个bit,一个十进制数等于8个bit位,一个十六进制比如01,它等于8个bit位,0表示0000,1表示0001。

无符号整型

   uint16_tuint8_t 和 uint32_t 是 C 语言中的无符号整数类型,分别表示不同的位宽。它们定义在 <stdint.h> 头文件中,用于确保整数类型的位宽在不同编译器和平台上的一致性。它们之间的关系如下:

1. 位宽和范围
  • uint8_t

    • 位宽:8 位(1 字节)
    • 范围:0 到 255(2^8 - 1)
  • uint16_t

    • 位宽:16 位(2 字节)
    • 范围:0 到 65,535(2^16 - 1)
  • uint32_t

    • 位宽:32 位(4 字节)
    • 范围:0 到 4,294,967,295(2^32 - 1)
2. 关系和转换
  • 存储容量

    • uint32_t 可以存储比 uint16_t 和 uint8_t 更大的数值范围。
    • uint16_t 可以存储比 uint8_t 更大的数值范围,但比 uint32_t 小。
  • 数据转换

    • 在将较小类型的数据(如 uint8_t 或 uint16_t)赋值给较大的类型(如 uint32_t)时,数据会自动扩展。例如,uint8_t 的值可以安全地赋值给 uint16_t 或 uint32_t,而不会丢失数据。
    • 将较大的类型的数据(如 uint32_t)赋值给较小类型(如 uint16_t 或 uint8_t)时,需要注意可能发生的数据丢失或溢出。例如,uint32_t 的值如果超出 uint16_t 的范围,赋值后会丢失高位数据。
3. 示例代码
#include <stdio.h>
#include <stdint.h>

int main() {
    uint8_t a = 255;      // 最大值 255
    uint16_t b = 65535;   // 最大值 65535
    uint32_t c = 4294967295; // 最大值 4294967295

    printf("uint8_t: %u\n", a);
    printf("uint16_t: %u\n", b);
    printf("uint32_t: %u\n", c);

    // 转换示例
    uint32_t largeValue = 50000;
    uint16_t smallerValue = (uint16_t)largeValue; // 强制转换
    printf("Converted uint16_t: %u\n", smallerValue); // 可能会丢失数据

    return 0;
}
4. 总结
  • uint8_tuint16_t 和 uint32_t 是无符号整数类型,分别具有 8 位、16 位和 32 位的宽度。
  • 选择合适的整数类型可以节省存储空间和提高效率,但在进行类型转换时要注意数据的范围和可能的溢出问题。

这些类型在处理嵌入式系统、通信协议和数据结构时非常有用,确保数据的准确性和一致性。

有符号整型

在 C 语言中,有符号整数类型用于表示可以包含负值的整数。它们与无符号整数类型类似,但具有额外的符号位来表示正负值。以下是常用的有符号整数类型及其表示方式:

  • int8_t

    • 位宽:8 位(1 字节)
    • 范围:-128 到 127
    • 示例
      int8_t a = -128;   // 最小值
      int8_t b = 127;    // 最大值
      
  • int16_t

    • 位宽:16 位(2 字节)
    • 范围:-32,768 到 32,767
    • 示例
      int16_t a = -32768; // 最小值
      int16_t b = 32767;  // 最大值
      
  • int32_t

    • 位宽:32 位(4 字节)
    • 范围:-2,147,483,648 到 2,147,483,647
    • 示例
      int32_t a = -2147483648; // 最小值
      int32_t b = 2147483647;  // 最大值
      
2. 类型定义

这些有符号整数类型由 C 标准库中的 <stdint.h> 头文件定义。它们是标准定义,确保在不同平台上的一致性。通过这些类型,你可以明确指定整数的位宽和符号特性。

3. 有符号与无符号的比较
  • 符号位

    • 有符号整数类型的最高位(即最左边的位)用于表示符号,0 表示正数,1 表示负数。
    • 无符号整数类型没有符号位,所有位都用于表示数值。
  • 数值范围

    • 有符号类型可以表示负数和正数,但其正数的范围比无符号类型少一半。
    • 无符号类型只能表示非负数,但其正数范围比有符号类型多一倍。
4. 示例代码
#include <stdio.h>
#include <stdint.h>

int main() {
    int8_t a = -128;      // 有符号 8 位整数
    int16_t b = -32768;   // 有符号 16 位整数
    int32_t c = -2147483648; // 有符号 32 位整数

    printf("int8_t: %d\n", a);
    printf("int16_t: %d\n", b);
    printf("int32_t: %d\n", c);

    // 转换示例
    uint32_t largeValue = 50000;
    int16_t smallerValue = (int16_t)largeValue; // 强制转换
    printf("Converted int16_t: %d\n", smallerValue); // 可能会丢失数据并且结果可能是负数

    return 0;
}
5. 总结
  • int8_tint16_t 和 int32_t 是有符号整数类型,分别具有 8 位、16 位和 32 位的宽度。
  • 有符号整数类型用于表示可以为负的数值,而无符号整数类型仅表示非负数值。
  • 选择适当的整数类型时,要根据需要的数值范围和是否需要表示负数来决定。

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一伦明悦

感谢,您的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值