uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

uint8_t / uint16_t / uint32_t /uint64_t 都是别名,c语言中有哪些数据类型?怎么样取别名

在C语言中有6种基本数据类型:short、int、long、float、double、char

1、数值类型
1)整型:short、int、long
2)浮点型:float、double
2、字符类型:char

二、使用 typedef
在这里插入图片描述
猛然一看有点看不懂,可能因为美观原因,源码把它分开写了,实际红色框的是一个整体,是对这个整体取别名,同一个数据类型可以有多个别名,就像在导师叫我小王,同学叫我棒哥一样,,,
在这里插入图片描述
如下注释:

   /* 7.18.1.1 */

    /* exact-width signed integer types */
typedef   signed           char int8_t;//给有符号char,取别名为int8_t
typedef   signed short     int int16_t;//给有符号短整型short int,取别名int16_t
typedef   signed           int int32_t;//给有符号整型short int,取别名int32_t
typedef   signed       __INT64 int64_t;

    /* exact-width unsigned integer types */
typedef unsigned          char uint8_t;//给无符号char,取别名为uint8_t
typedef unsigned short     int uint16_t;//给无符号短整型short int,取别名为uint16_t
typedef unsigned           int uint32_t;//给无符号整型short int,取别名为uint32_t
typedef unsigned       __INT64 uint64_t;

    /* 7.18.1.2 */
//和上面一样,取其他别名
    /* smallest type of at least n bits */
    /* minimum-width signed integer types */
typedef   signed          char int_least8_t;
typedef   signed short     int int_least16_t;
typedef   signed           int int_least32_t;
typedef   signed       __INT64 int_least64_t;

    /* minimum-width unsigned integer types */
typedef unsigned          char uint_least8_t;
typedef unsigned short     int uint_least16_t;
typedef unsigned           int uint_least32_t;
typedef unsigned       __INT64 uint_least64_t;

    /* 7.18.1.3 */

    /* fastest minimum-width signed integer types */
typedef   signed           int int_fast8_t;
typedef   signed           int int_fast16_t;
typedef   signed           int int_fast32_t;
typedef   signed       __INT64 int_fast64_t;

    /* fastest minimum-width unsigned integer types */
typedef unsigned           int uint_fast8_t;
typedef unsigned           int uint_fast16_t;
typedef unsigned           int uint_fast32_t;
typedef unsigned       __INT64 uint_fast64_t;

为什么喜欢叫它 int8_t, uint8_t;int16_t, uint16_t;int32_t, uint32_t?
1,数据类型中都带有_t, _t 表示这些数据类型是通过typedef定义的,而不是新的数据类型。也就是说,它们其实是我们已知的类型的别名。
2,8,16,32又是什么意思?
这些数字都是位数,即,使用多少位来存储数据,一个字节8位,其中因为数字有正负之粉,对应有符号(signed,最高位为0,表示正数)和无符号(unsigned,最高位为1,表示负数),所以表示的范围不一样,但是因为位数一致,故表示的个数是一样的。
比如使用16位,也就是两个字节来存储
可以是 typedef signed short int int16_t;//给有符号短整型short int,取别名int16_t
也可以是 typedef unsigned short int uint16_t;//给无符号短整型short int,取别名为uint16_t
uint16_t 表示数据范围则是0 ~65535。
int16_t 表示数据范围为-32768~32767
表示的个数是一样的:65536=2的16次方

参考这个博主的一段话:
整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0 ~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。同时在相同位数的情况下,所能表达的整数范围变大。

挖一下这句话
在默认情况下声明的整型变量都是有符号的类型(char有点特别),有什么特别呢

如何确认char到底是signed char还是unsigned char

ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char 、char相当于signed char或者unsigned char,但是这取决于编译器
这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。
signed char取值范围是 -128 到 127
unsigned char 取值范围是 0 到 255

有符号和无符号有默认的,可以省略不写,默认情况下声明的整型变量都是有符号的类型

typedef char    int8_t; 

如果编译器认为是signed char= char,上面那句就相当于

typedef signed char    int8_t;   

如果编译器认为是usigned char= char,上面那句就相当于

typedef usigned char    int8_t;   

再看:

typedef unsigned short   int uint16_t;
typedef unsigned   int uint32_t;

参考:C语言中的整数(short,int,long)
short、int、long 是C语言中常见的整数类型,其中 int 称为整型,short 称为短整型,long 称为长整型。

int
short int:int可以省略
long int:int可以省略

描述 short、int、long 类型的长度时,只对 short 使用肯定的说法,而对 int、long 使用了“一般”或者“可能”等不确定的说法。这种描述的言外之意是,只有 short 的长度是确定的,是两个字节,而 int 和 long 的长度无法确定,在不同的环境下有不同的表现。
2 ≤ short ≤ int ≤ long

这就意味着,short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。
一般short 2字节,int 4字节,liong 8字节。

这样取别名为uint8_t / uint16_t / uint32_t /uint64_t 的好处是?
1,从名字一眼就可以看出,使用多少位来存数据,统一了“标准”
2,为了程序的可扩展性, 假如我们此刻将来我们需要的数据大小变成了64bit时,我们只需要将typedef long long size_t就可以了, 不然我们可要修改好多好多的地方了,当自己设计一个int类型保存某种数据时,但你又没把握将来是不是要用long int时你可以引用一个自己定义的数据类型

假如本程序此时需要一个数据大小为32位的用来存储正数的类型 size_t
在原来已经定义的如下别名的基础上:

typedef unsigned  int uint32_t;
typedef unsigned  long int uint64_t;

可以再次取别名:

typedef  uint32_t  size_t ;

如果以后要改成64位的,就改为:

typedef  uint64_t  size_t ;

size_t在代码中出现的,含义全部更改,可扩展性好。

__int64这种类型是什么?
参考:long int与long long的区别
在这里插入图片描述
测试代码:

typedef unsigned int       uint32_t;
typedef unsigned long       uLint32_t;
typedef unsigned  long long  uint64_t;
//typedef unsigned  long long int  uint64_t;
typedef unsigned short    int uint16_t;

int main()
{
	uint32_t a;
	a = 12;
	printf("unsigned int对应sizeof(a) = %d\n", sizeof(a));

	uLint32_t a1;
	a1= 12;
	printf("nsigned long对应 sizeof(a1) = %d\n", sizeof(a1));

	uint64_t b;
	b = 12;
	printf("unsigned  long long对应  sizeof(b) = %d\n", sizeof(b));

	uint16_t c;
	c = 12;
	printf("unsigned short 对应   int sizeof(c) = %d\n", sizeof(c));

	int d;
	d= 12;
	printf("int 对应sizeof(d) = %d\n", sizeof(d));

	long  e;
	e = 12;
	printf("long 对应 sizeof(e) = %d\n", sizeof(e));

	long long  f;
	f = 12;
	printf("long long对应 sizeof(f) = %d\n", sizeof(f));
}

结果:
在这里插入图片描述
long int
  long int即long,给人的感觉好像是长整型,但实际上,它和int一样,只有32位
int - basic integer type. The keyword int may be omitted if any of the modifiers listed below are used. If no length modifiers are present, it’s guaranteed to have a width of at least 16 bits. However, on 32/64 bit systems it is almost exclusively guaranteed to have width of at least 32 bits.
long - target type will have width of at least 32 bits.

long long则不同,long long是C++的64位整型的基本类型,“现任”长整型,从C99开始引入这个概念,在后续的标准中完善概念和定义,C++11官方正式标准如下——
long long - target type will have width of at least 64 bits.(since C++11)

STM32微控制器使用Keil集成开发环境时,如果需要将浮点数(float)转换为uint8_t数组,首先你需要了解的是浮点数通常采用IEEE 754标准表示,而uint8_t数组通常用于存储整数或字节数据。这是一个常见的数据转换步骤,但因为涉及到精度损失,所以需要特别处理。 以下是一个简单的步骤说明: 1. **包含头文件**: 首先,确保包含`stdint.h`头文件,它包含了必要的数据类型定义。 ```c #include <stdint.h> ``` 2. **定义转换函数**: 创建一个函数,例如`floatToByteArray()`, 它接受一个float值和一个指向uint8_t数组的指针。 ```c void floatToByteArray(float value, uint8_t *array, int byteCount) { // 指定转换所需的位数,如32位单精度float需要4字节 floatBitsToUint8(value, array, byteCount); } ``` 3. **实现转换内部函数**: 使用宏或手动编写代码将float值拆分为它的二进制形式,并逐字节存储到数组。这里可以使用位操作来实现。 ```c // 如果你有位运算能力的话 #define FLOAT_TO_BYTE(val, arr, index) \ do { \ arr[index] = (val & 0xFF); \ val >>= 8; \ } while (0); void floatBitsToUint8(float f, uint8_t *arr, int byteCount) { for (int i = 0; i < byteCount; ++i) { FLOAT_TO_BYTE(f, arr, i); } } // 或者如果你不想用位运算,使用库函数或者在线工具(但可能会丢失精度) void floatBitsToUint8(float f, uint8_t *arr, int byteCount) { float_to_fixed_point(f, arr, byteCount, sizeof(float) * CHAR_BIT); } ``` 请注意,上述代码展示了基本的概念,实际应用中可能存在精度损失。如果你想保留尽可能多的小数部分,可能需要使用专门的固定点数学库。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值