《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义

文章目录

    • 助记提要
    • 7章 基本类型
      • 7.1 整数类型
        • 有符号整数和无符号整数
        • 整数类型的说明符
        • 整数类型的范围
        • 整型常量
        • 整数溢出
        • 读/写整数
      • 7.2 浮点类型
        • 浮点数的范围
        • 浮点常量
        • 读/写浮点数
      • 7.3 字符类型
        • 字符被当做整数来操作
        • 转义序列
        • 大小写转换
        • `scanf`和`printf`读/写字符
        • `getchar`和`putchar`读写字符
      • 7.4 类型转换
        • 类型转换的必要性
        • 发生隐式转换的情况
        • 常规算术转换
        • 赋值时的转换
        • 强制类型转换
      • 7.5 类型定义
        • 类型定义的好处
      • 7.6 sizeof运算符

助记提要

  1. 6种整数类型;
  2. 如何确定整数类型的范围;
  3. 编译器如何确定整型常量的范围;
  4. 整数溢出时的行为;
  5. 读写整数的转换说明符;
  6. 浮点数的范围;
  7. 数字转义序列;
  8. getchar的惯用法;
  9. 需要类型转换的原因;
  10. 会发生隐式转换发生的4个情况;
  11. 常规算数转换和赋值转换的规则;
  12. 强制类型转换的应用;
  13. typedef的优点;
  14. sizeof的2个注意事项;

7章 基本类型

7.1 整数类型

有符号整数和无符号整数

最左边带符号位的是有符号整数。正数或0的符号位是0;负数的符号位是1。
不带符号位的整数是无符号整数,最左边的位也是数值的一部分。无符号整数主要用于系统编程和底层与机器相关的应用。

C语言的整数默认都是有符号的。如果要告诉编译器变量没有符号位,需要把它声明为unsigned类型。

整数类型的说明符

除了int外,C语言还提供了长整型和短整型,用来存储大数或存小数节省空间。
为了使构造的整数类型满足需要,可以指明变量是long类型或short类型,signed类型或unsigned类型。也能把说明符组合起来,产生以下6种不同的类型:

short int
unsigned short int
int 
unsigned int
long int
unsigned long int

其他组合都是这6种类型的同义词。

由于整数默认都是有符号的,所以signed可以省略。
C语言允许省略int来缩写整数类型的定义。unsigned short int可以写为unsigned short
说明符的先后顺序不影响类型声明。

为了满足对超大型整数的需求和适应64位的处理器,C99提供了long long intunsigned long long int两种类型。

整数类型的范围

C标准要求每个整型类型都要覆盖一个确定的取值范围。
其次,short int类型不能比int类型长,long int类型不能比int类型短。

在不同的机器上,通常的取值范围如下:
16位机

类型最小值最大值
short int
int
-215215-1
unsigned short int
unsigned int
02^16-1
long int-231231-1
unsigned long int0232-1
32位机
类型最小值最大值
:----:----::----:
short int-215215-1
unsigned short int02^16-1
long int
int
-231231-1
unsigned long int
unsigned int
0232-1
64位机
类型最小值最大值
:----:----::----:
short int-215215-1
unsigned short int02^16-1
int-231231-1
unsigned int0232-1
long int-263263-1
unsigned long int0264-1

这些范围不是C标准强制的,不同的编译器也可能不同。
C标准库有<limits.h>头,其中定义了每种整数类型的最大值和最小值的宏,可以用它来确定某个实现中整数类型的范围。

C99的long long int类型要求至少是64位宽。long long int范围通常是-263到263-1,而unsigned logn long int是0到264-1。

整型常量

C语言允许用十进制、八进制和十六进制的形式书写整型常量。

  • 十进制常量包含0~9的数字,但是不能以0开头。
  • 八进制常量包含0~7的数字,必须以0开头。
  • 十六进制常量包含09的数字和af的字母,总是以0x开头。字母大写或小写都可以。

不同进制只是数的书写方式,所有的数都是二进制的形式存储的。
八进制和十六进制更适用于底层程序的编写。

编译器如何判断常量的类型
十进制的常量类型一般为int,如果int不够,就用long int类型。long int也不够,则用unsigned long int做最后的尝试。
而对八进制和十六进制,编译器会一次尝试intunsigned intlong intunsigned long int类型,直到找到能表示该常量的类型。

C99对于没有后缀的十进制常量,会使用intlong intlong long int中可表示该值的最小类型。对于八进制和十六进制常量,类型判定顺序为intunsigned intlong intunsigned long intlong long intunsigned long long int

在常量后面加上字母Ll,可以强制编译器把常量做为长整数处理。在常量后加Uu,可以指定无符号常量。LU可以结合使用。
C99中以LLll结尾的整型常量是long long int类型。

整数溢出

算数运算时,结果可能因为太大而无法表示。
对两个int进行算数运算时,结果必须仍然可以用int表示,否则就会发生溢出。

整数溢出时的行为和整数的负号有关:

  • 有符号整数溢出的行为是未定义的。可能只是运算出错,也可能程序崩溃。
  • 无符号整数溢出时,结果是正确值对2n取模。n是存储结果的位数。
读/写整数
  • %d只适用于int类型。
  • 无符号整数,使用%u%o%x分别表示十进制、八进制、十六进制。
  • 短整数在d、o、u、x前面加上h
  • 长整数在d、o、u、x前面加上l
  • 长长整数(C99)在d、o、u、x前面加上ll
unsigned int u;
scanf("%u", u);     // 读入十进制
printf("%u", u);    // 显示十进制
scanf("%o", u);     // 读入八进制
printf("%o", u);    // 显示八进制
scanf("%x", u);     // 读入十六进制
printf("%x", u);    // 显示十六进制short s;
scanf("%hd", s);    // 读入短整型
printf("%hd", s);   // 显示短整型long l;
scanf("%ld", l);    // 读入长整型
printf("%ld", l);   // 显示长整型long long ll;
scanf("%lld", ll);  // 读入长长整型
printf("%lld", ll); // 显示长长整型

%x%o只适合用于显示无符号整数或正数。因为printf会假设被转换的数值是无符号的,如果符号位为1,会显示一个预期外的大数。
显示负数的八进制或十六进制的情况很少。需要显示时可以自己输出一个负号。

7.2 浮点类型

C语言的浮点数格式有三种:float,单精度浮点数;double,双精度浮点数;long double,扩展精度浮点数。

浮点数的范围

C标准没有规定floatdoublelong double类型的精度。大多数计算机遵循IEEE标准。

IEEE标准提供了单精度和双精度的格式标准。单精度32位,双精度64位。
数值义科学计数法存储,每个数由符号指数小数组成。指数部分表示数值的可能大小,小数部分的位数表示精度。

单精度数,指数占8位,小数占23位。单精度数可以表示的最大值是由指数决定的,指数范围-126到127(-127和128有特殊用途),指数最大是2127;32位小数位都是1时底数最大,最大底数约等于2。所以单精度数可表示的最大值为 2*2127≈3.402*1038

浮点常量

浮点常量必须包含小数点或指数。如果有指数,需要在指数值前面加字母eE

默认情况下,浮点常量以double的形式存储,在需要时可以自动转为float
为了让编译器以float格式存储,可以在常量的末尾加上字母Ff;要以long double格式存储,在末尾加Ll

C语言默认倾向于使用精度更高的double类型。用float类型是为了节省空间和时间。

读/写浮点数
  • float类型
    %e%f%g用于读写单精度浮点数。

  • double类型
    scanf函数读取double类型时,在前面加小写字母l
    printfefg既可以写float也可以写double。C99允许printf函数使用%le%lf%lg,但是字母l不起作用。

    scanf和printf函数有可变长度的参数列表。调用可变长度的参数列表时,编译器会把float参数自动转成double类型。这导致printf无法区分float和double,所以%f在printf中既可以表示float又可以表示double。而scanf是读取的值要通过指针传给变量,%f%lf必须区别开,才能正确存储对应的字节数。

    double d;
    scanf("%lf", &d);
    printf("%f", d);
    
  • long double类型
    读写long double类型时,在前面加大写字母L

    long double ld;
    scanf("%Lf", &ld);
    printf("%Lf", ld);
    

十六进制浮点常量以0x0X开头,且必须包含指数(跟在字母p或P后面)。指数以十进制表示,可以为负,代表2的幂。如:0x1.Bp3表示1.6875 × 2^3^ = 13.5
十六进制浮点常量主要用于指定精度要求较高的浮点常量。十进制数在转为二进制时可能受到舍入误差的影响,而十六进制有精确的二进制表示。

7.3 字符类型

char字符类型的值依据机器的字符集来定。
目前最常用的字符集是美国信息交换标准码(ASCII)字符集。它使用7位代码来表示128个字符。

char类型的变量可以用任意的单个字符赋值。赋值时,字符常量需要使用单引号括起来,不能用双引号。

字符被当做整数来操作

C语言把字符当做小整数进行处理。
计算中出现字符时,C语言只是使用它对应的整数值。可以像比较数字那样对字符进行比较。

以数字的方式处理字符的坏处是,编译器无法发现处理过程中的编程错误。程序在使用不同字符集的机器上也可能会不兼容。

字符类型的符号
C标准没有规定char类型的数据是有符号还是无符号型。有些编译器把它们当做有符号型来处理,有些编译器当做无符号型处理。
为了保证可移植性,不要假设char类型默认是signedunsigned。在需要作区别的时候,使用signed charunsigned char

声明为char的变量存储的字符如果只有7位长度,不需要考虑其符号。如果有8位长度,许多编译器会把它当做有符号的字符来处理。后面这个变量只作为字符使用就不会有问题,但是如果需要转换为整数,就可能会有问题(结果为负数)。

转义序列

一些特殊字符无法用键盘输入,或不可见。使用转义序列可以让程序处理字符集中的每一个字符。
转义序列有两种:字符转义序列和数字转义序列

  • 字符转义序列
字符转义序列说明
\a警报符
\b回退符
\f换页符
\n换行符
\r回车符
\t水平制表符
\v垂直制表符
\\反斜杠
?问号
单引号
"双引号

字符转义序列很易使用,但是只包含了最常用的字符。有些无法打印的字符和ASCII码以外的字符没有被包含在内。
而数字转义序列可以表示任何字符。

  • 数字转义序列

字符的八进制和十六进制值可以用来书写转义序列。
使用八进制做转义序列时,由字符\和跟在后面的最多含3位数字的八进制数组成。如\33\033
十六进制转义序列由\x和跟在后面的十六进制数组成。

int main() {printf("%c\n", 'a');printf("%d\n", 'a');printf("\141\n");printf("\x61\n");return 0;
}
a
97
a
a

八进制和十六进制转义序列表示的数必须为无符号数,所以八进制值最大为377。标准C对十六进制数的位数没有限制,在字符长度为8位时,十六进制值最大为FF。

大小写转换

使用if语句可以把小写字母转换为大写字母:

if ('a' <= ch && ch <= 'z')ch = ch - 'a' + 'A';

也可以使用C语言的库函数toupper

#include <ctype.h>ch = toupper(ch);
scanfprintf读/写字符

使用转换说明符%c对单个字符读写:

char ch;
scanf("%c", &ch);
printf("%c", ch);

scanf在读取数值时,会自动跳过空白符,但是读取字符时不会。
为了强制它读入字符前跳过空白字符,可以在转换说明的前面加一个空格:

scanf(" %c", &ch);

scanf不跳过空白符的特性可以用来检查是否是输入行的结尾。

getcharputchar读写字符

getchar读入一个字符并返回。putchar输出单个字符。
getcharputchar的执行速度比scanfprintf要快。因为不需要考虑数据的不同格式,而且getcharputchar是做为宏实现的。
getchar在读取时也不会跳过空白符。
scanf函数的返回值一般是1。而getchar函数返回的是读取到的字符。由此getchar能很方便的应用在需要对字符做条件判断的地方。

// scanf实现
do {scanf("%c", &ch);
} while (ch != '\n');// 使用getchar
while ((ch=getchar()) != '\n');

getchar常用的两种场景:

// 跳过剩余的行
while (getchar() != '\n');
// 跳过空格。循环结束时,ch的值为遇到的第一个非空字符
while ((ch=getchar()) != ' ');

注意 混用scanfgetchar时,由于scanf会把没有消耗的任意字符留下,getchar取到的字符可能不是希望的结果:

printf("Enter an integer: ");
scanf("%d", &i);
printf("Enter a command: ");
// command取到换行符
command = getchar();

7.4 类型转换

类型转换的必要性

C语言允许在表达式中混合使用基本类型。而计算机执行算术运算时,要求操作数有相同的位数,和相同的存储方式。
C编译器会自动生成一些指令,把操作数转换为合适的类型,这样表达式才能被硬件计算。
这种编译器自动处理的转换称为隐式转换。而由程序员使用强制运算符执行的是显式转换

发生隐式转换的情况
  1. 算术表达式或逻辑表达式中的操作数类型不同(常规算术转换);
  2. 赋值表达式右侧表达式的类型和左侧变量的类型不匹配;
  3. 函数调用的实参类型和形参类型不匹配;
  4. return语句中表达式类型和函数返回值类型不匹配。
常规算术转换

常规算术转换会把两个操作数转换为可以安全地适用于两个数值的存储位数最小的类型。
通常是把存储位数较少类型的操作数转换为另一个操作数的类型。这种操作称为提升

常规算术转换可以分成两种情况:

  1. 任一操作数是浮点类型
    float->double->long double的顺序,对存储位数小的操作数做提升。
  2. 两个操作数都不是浮点类型
    先把两个操作数进行整值提升(确保没有字符型或短整型操作数),然后按int->unsigned int->llong int->unsigned long int的顺序提升存储位数小的操作数。
    如果出现long intunsigned int类型长度相同的情况,两个操作数会转换为unsigned long int类型。

注意 有符号操作数和无符号操作数混用时,有符号操作数会转换为无符号的值。转换过程会加上或者减去n+1的倍数。n是无符号整数可表示的最大值。实际编程时要避免使用无符号整数,更不要和有符号整数混用。

int main() {// 混合比较有符号整数和无符号整数int a = -1;unsigned int b = 5;printf("%d\n", (a<b));	// 输出结果为0,不符合预期return 0;
}

C99中增加了一些新的类型,转换规则也有变化。它先规定了整数类型的转换等级:

  1. (最高)long long intunsigned long long int
  2. long intunsigned long int
  3. intunsigned int
  4. short intunsigned short int
  5. charsigned charunsigned char
  6. (最低)_Bool

C99在任一操作数是浮点类型时,规则同上。在两个操作数都不是浮点类型时,依次执行以下判定:

  1. 先把转换等级低于intunsigned int的类型转为intunsigned int,如果这时两个操作数类型相同,就结束转换;
  2. 如果都是有符号型,或都是无符号型,把转换等级低的操作数转换为等级高的操作数类型;
  3. 如果无符号操作数等级高于或等于有符号操作数,转为无符号操作数的类型;
  4. 如果有符号操作数的类型可以表示无符号操作数类型的所有值,转为有符号操作数的类型;
  5. 其他情况,都转换为与有符号操作数的类型对应的无符号类型。
赋值时的转换

赋值时会把右边表达式转换为左边变量的类型。
这种规则出问题的情况:

  1. 浮点数赋值给整型变量时,小数部分丢失;
  2. 过大的值赋值给存储位数较小的类型变量时,会得到无意义的结果。
强制类型转换

强制类型转换的表达式

(将转换的类型名) 表达式

C语言把(类型名)视为一元运算符,其优先级高于二元运算符。

强制类型转换的应用:

// 计算浮点型值的小数部分
float f, frac_part;
frac_part = f - (int) f;
// 避免溢出
long i1, i2;
int j = 100000;
// 由于两个int相乘,结果还是int类型,因此可能会溢出
// 溢出后,把错误的值转为long
i1 = j * j;
// 先把j转为long再计算可避免溢出
i2 = (long) j * j;

7.5 类型定义

前面使用宏定义布尔类型

#define BOOL int

可以使用类型定义语句实现布尔类型:

typedef int Bool;

Bool是新类型的名字。首字母不是必须大写。

typedef定义的类型会加入到编译器识别的类型名列表中。

类型定义的好处
  • 能使程序更易于理解,后续需要修改类型也更方便。

    // 可以在这里修改Dollars的类型
    typedef float Dollars;
    // 易于理解
    Dollars cash_in, cash_out;
    
  • 提高易移植性。
    不同机器上的类型取值范围可能是不同的。
    可以使用typedef定义新的类型,避免使用int或其他可能因机器而变化的类型声明。这样在需要更改更大的数据类型时很方便,但是要修改转换说明(如%d改为%ld)依然很麻烦。

    C语言库使用typedef为可能因实现而不同的类型创建类型名,这些类型名一般以_t结尾。
    C99的<stdint.h>头中使用typedef定义占用特定位数的整数类型名。如int32_t是占用32位的有符号整型。

  • 比宏定义更好用
    数组和指针不能定义为宏,但是类型定义可以。
    函数体内typedef定义的名称在函数体外是不识别的。而宏的名称会在任何出现的地方被替换。

7.6 sizeof运算符

用于获取存储指定类型的值需要的内存空间

sizeof(类型名)

返回值是一个无符号整数,表示存储某个类型的字节数。
sizeof也可以用于常量、变量和表达式。
sizeof用于表达式时不需要加圆括号,但是它做为一元运算符,优先级比二元运算符高,使用时为了方便理解,最好加上圆括号。

// 不需要加圆括号也可以
// 先获取i的存储位数,然后再把结果与j相加
sizeof i + j;
// 最好加上圆括号,便于理解
sizeof(i + j);

注意 sizeof表达式的值是size_t类型,由实现决定的类型。
在C89中最好在转换前把表达式的值转换为一种已知类型,并在显示时使用对应的转换说明符。
C99中的printf可以直接显示size_t的值,不发生强制转换,方法是在转换说明中使用字母z

printf("%zu\n", sizeof(int));

C99引入了变长数组,编译器不能用sizeof确定变长数组的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/16602.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构设计师:软件架构的演化和维护

软件架构一般会经历初始设计、实际使用、修改完善和退化弃用的过程&#xff0c;其中修改完善的过程实际上就是软件架构的演化和维护过程&#xff0c;演化和维护的目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等。 软件架构的演化和维护过程是一个不断…

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook&#xff0c;并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…

IoT [remote electricity meter]

IoT [remote electricity meter] 物联网&#xff0c;远程抄表&#xff0c;电表数据&#xff0c;举个例子

使用ivew-ui-plus 的Submit组件踩坑 injection “LoginInstance“ not found 记录 问题原因分析与解决方案

问题描述: 在下面这个页面中 注册按钮使用了view-ui-plus的Submit组件 结果控制台报错 runtime-core.esm-bundler.js:257 Uncaught TypeError: Cannot read properties of undefined (reading handleSubmit)at Proxy.handleSubmit (viewuiplus.min.esm.js:32610:26)at callW…

力扣 LeetCode 1047. 删除字符串中的所有相邻重复项(Day5:栈与队列)

解题思路&#xff1a; 方法一&#xff1a;栈 class Solution {public String removeDuplicates(String s) {Deque<Character> stack new ArrayDeque<>();for (char c : s.toCharArray()) {if (stack.isEmpty() || stack.peek() ! c) stack.push(c);else stack.p…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

网络IP地址会经常换吗?深入解析与实操指南

在互联网的生态系统中&#xff0c;IP地址&#xff08;Internet Protocol Address&#xff09;是每台连接设备的唯一标识符&#xff0c;它在网络通信中起着至关重要的作用。然而&#xff0c;不少用户观察到自己的IP地址有时会发生变化&#xff0c;这引发了诸多疑问。本文旨在详细…

AI测试的主要研究方向介绍

随着AI技术的不断进步和应用场景的日益广泛&#xff0c;如何确保人工智能系统的可靠性和安全性&#xff0c; 变得日益重要。人工智能测试作为保障AI系统质量的关键环节&#xff0c;也随着AI技术不断向前发展。本文将介绍当前AI测试的主要研究方向&#xff0c;以期为大家提供一个…

Python3中str和bytes

参考文章&#xff1a;浅析Python3中的bytes和str类型 - Chown-Jane-Y - 博客园 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str…

比特币前景再度不明,剧烈波动性恐即将回归

比特币市场降温&#xff0c;波动性增加 自特朗普赢得美国总统大选以来&#xff0c;比特币市场的投机狂热有所降温&#xff0c;现货和衍生品市场的活跃度开始减弱。比特币在上周五跌破87000美元&#xff0c;较之前创下的历史高点低了约6500美元。这一变化受到美联储主席鲍威尔讲…

node对接ChatGpt的流式输出的配置

node对接ChatGpt的流式输出的配置 首先看一下效果 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联…

esp32c3安装micropython环境

esp32c3竟然支持micropython环境&#xff0c;真的太让人高兴了。主要是python开发比较友好&#xff0c;开发速度要快于C和C&#xff0c; 可以用来快速创意验证。 下载 首先到官网&#xff1a;MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…

Linux运维工程师推荐学习的开发语言

前言&#xff1a;会开发的运维和不会开发的运维可以说是两个世界的运维。 个人推荐python和go&#xff0c;前者可以做自动化运维&#xff0c;后者可以深挖k8s&#xff1b;最近就不先演示运维服务技术的部署和架构搭建了&#xff0c;在深挖自动化运维&#xff0c;为了让现在的工…

新手小白学习docker第八弹------实现MySQL主从复制搭建

目录 0 引言1 实操1.1 新建主服务器容器1.2 书写配置文件1.3 重启master实例1.4 进入mysql-master容器master容器实例内创建数据同步用户 1.5 新建从服务器容器1.6 书写配置文件1.7 重启slave实例1.8 查看主从同步状态1.9 进入mysql-slave容器1.9.1 配置主从复制1.9.2 查看主从…

我谈二值形态学基本运算——腐蚀、膨胀、开运算、闭运算

Gonzalez从集合角度定义膨胀和腐蚀&#xff0c;不易理解。 Through these definitions, you can interpret dilation and erosion as sliding neighborhood operations analogous to convolution (or spatial filtering). 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向…

力扣题目解析--合并两个链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff…

基于yolov8、yolov5的鸟类分类系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

css:浮动

网页的本质上就是摆放盒子&#xff0c;把盒子摆到相应的位置上 css提供了三种传统的布局方式&#xff1a; 普通流&#xff08;标准流&#xff09;&#xff1a;标签按默认方式排列&#xff0c;最基本的布局方式 浮动 定位 实际开发中&#xff0c;一个网页基本包含了三种这种布局…

Essential Cell Biology--Fifth Edition--Chapter one (6)

1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器&#xff0c;这些细胞器被单层膜…