4月底的一些查询信息汇总

23/05/06一些琐碎小笔记, 包含C语言的基础知识,和基础dart

五一节后 工作日第三天 整理


前言

主要包含C语言的基础知识,和基础dart


一、C语言

1. 格式化字符串 / 函数指针导致的报错

printf 内容为 字符串%s,

uint8_t / uint16_t / uint32_t /uint64_t

相当于一种typedef的预定义,%x 表示输出十六进制无符号整数,%lu 表示输出一个无符号长整型

指针地址一类,&,*,涉及结构体, .  ->

unit64_t %llu 
unit32_t %u
unit16_t %hu 
uint32_t a;
a = 12;
printf("a = %x\n",a); // %x 表示输出十六进制无符号整数
printf("sizeof(a) = %lu\n",sizeof(a)); // %lu 表示输出一个无符号长整型
必须小心 uint8_t 类型变量的输出,例如如下代码:

uint8_t fieldID = 67;
cerr<< "field=" << fieldID <<endl;
结果发现是:field=C 而 不是我们所想的 field=67

这是由于 typedef unsigned char uint8_t; 
uint8_t 实际是一个 char, cerr << 会输出 ASCII 码是 67 的字符,而不是 67 这个数字.
因此,输出 uint8_t 类型的变量实际输出的是其对应的字符, 而不是真实数字.
若要输出 67,则可以这样:
cerr<< "field=" << (uint16_t) fieldID <<endl;
结果是:field=67
同样: uint8_t 类型变量转化为字符串以及字符串转化为 uint8_t 类型变量都要注意, uint8_t类型变量转化为字符串时得到的会是ASCII码对应的字符, 字符串转化为 uint8_t 变量时, 会将字符串的第一个字符赋值给变量.

 2. if (k->val[i / 30] & (1u << (i % 30))) { 位运算

这是一行C++代码,用于判断一个长度为n的“01串”中的第i个字符是否为1。其中,k表示一个数值结构体(可能是一个数组或一个自定义的结构体),val是这个结构体中的一个数组,假设这个数组长度为(n+29)/30,也就是将n个字符划分为每组30个字符,最后一组可能不足30个。

这行代码实际上做了两件事:

1.使用位运算得到第i个字符所在的数组元素。

i / 30表示第i个字符所在的组的下标,也就是说,第i个字符位于第(i/30)个数组元素中。因为一个32位整数可以存储30个字符(0或1),所以整个数组的长度为(n+29)/30,即将n个字符分成30个一组,不足30个的单独算一组,数组的每个元素可以表示30个字符。因此,i / 30可以得到该字符在数组中的下标。

1u表示一个无符号的整数1,要用无符号整数是为了避免左移时发生符号扩展。1u << (i % 30)表示将1左移i%30位,得到一个二进制数,其中只有第(i%30)位为1,其他位为0。这个二进制数用于判断第i位为1还是0。例如,当i=5时,1u << (i%30)的结果为0x20(二进制为00000000000000000000000000100000),表示只有第5位为1,其他位为0。

2.判断第i个字符是否为1

运算符&表示按位与,如果两个二进制位都为1,则结果为1,否则为0。因此,k->val[i / 30] & (1u << (i % 30))实际上是将第(i/30)个数组元素中第(i%30)个二进制位与左移后的二进制数(只有第i位为1,其他位为0)做按位与运算,如果结果为0,则表示第i位为0,否则表示第i位为1。

综上所述,这行代码的作用就是判断一个长度为n的“01串”中第i位是否为1。

二、dart

1. StreamSubscription

StreamSubscription 是一个流的订阅类,它可以订阅并取消对流的监听。listen 方法可以用于注册回调函数 onData,并返回一个 StreamSubscription 实例,用于后续的流取消监听操作。 onDataonErroronDone 是三个可选参数,具体作用如下:

StreamSubscription<T> listen(void onData(T event)?,
{Function? onError, void onDone()?, bool? cancelOnError});

2.关于函数赋值

代码如下(示例):


transport.nofitySubscription = this._monitorCharacteristic(transport.notifyCharacteristic);这一步骤中, this._monitorCharacteristic(transport.notifyCharacteristic)一函数的内容被进行了吗

是的,`transport.nofitySubscription`被赋值为`this._monitorCharacteristic(transport.notifyCharacteristic)`的返回值,也就是函数的执行结果。具体来说,`this._monitorCharacteristic()`函数用于监听指定的特征值,当这个特征值有新数据时,就会调用监听回调函数。在代码中,`transport.notifyCharacteristic`被传入函数中,作为需要进行监听的特征值。当调用`this._monitorCharacteristic(transport.notifyCharacteristic)`函数后,它会返回一个新的函数,通过执行这个新的函数,就可以实现对这个特征值的监听。而`transport.nofitySubscription`则保存了这个新的函数,以便之后取消对特征值的监听。所以,在赋值之后,`transport.nofitySubscription`是已经进行了函数执行并获取返回值的。

三、git

1. Git:git reset 还原修改,git diff 查看修改的变化。

在 Git 中,可以通过 git reset 命令来还原修改,通过 git diff 命令来查看修改的变化。

四、计算机基础

1. 字长

32位系统的全字长是4字节(32位),64位系统的全字长是8字节(64位)。这个值之所以不是32/64,是因为计算机内部数据的处理都是按照一个完整的字节进行的,而一个字节有8位,因此32位系统的一个字节是8位,全字长是32位(也就是4个字节),同理64位系统的一个字节是8位,全字长是64位(也就是8个字节)。

在计算机系统中,全字长的大小决定了计算机能够处理的数据量以及内存的寻址空间大小。一个32位系统可以处理最多32位的数据,最多寻址2^32个内存单元(即4GB),而一个64位系统可以处理最多64位的数据,最多寻址2^64个内存单元(即16EB)。

因此,64位系统相比32位系统具有更大的内存寻址空间和更强的数据处理能力。这也就意味着在处理大量数据和运行大型程序时,64位系统相比32位系统具有更高的效率和性能。但是,在32位系统上运行一些小型应用程序时,其运行速度可能会更快。

2.对应的kb,mb,gb

2^32的计算结果是4294967296(即4,294,967,296),这个数值的位数是32位,即二进制数字由32个二进制位组成。

接下来我们来将这个数值转换成各种存储单位。由于计算机内部的数据处理和存储通常是按照2的幂次方进行的,因此我们将使用2作为计算单位。

- KB(Kilobyte,千字节):2^10 = 1,024,因此,2^32 字节 = 2^22 KB ≈ 4,194,304 KB
- MB(Megabyte,兆字节):2^20 = 1,048,576,因此,2^32 字节 = 2^12 MB ≈ 4,096 MB
- GB(Gigabyte,吉字节):2^30 = 1,073,741,824,因此,2^32 字节 ≈ 4 GB
- TB(Terabyte,太字节):2^40 = 1,099,511,627,776,因此,2^32 字节 = 2^-28 TB ≈ 0.004 TB

需要注意的是,在计算存储容量时通常采用十进制单位(如1KB = 1000字节,1MB = 1,000,000字节),而在计算机内部处理和存储数据时采用二进制单位(如1KB = 1024字节,1MB = 1,048,576字节)。因此,在转换存储单位时需要根据具体情况选择合适的计算方式。


总结

一些基础知识

猜你喜欢

转载自blog.csdn.net/m0_73016265/article/details/130529982