当前位置: 首页 > news >正文

【CSAPP】整数表示

文章目录

  • 整型数据类型
  • 无符号数的编码
  • 补码编码
    • 确定大小的整数类型
    • 练习1
    • 练习2
  • 有符号数和无符号数之间的转换
    • 练习
  • C语言中的有符号数与无符号数
    • 练习
  • 扩展一个数字的位表示
    • 练习1
    • 练习2
  • 截断数字
    • 练习
  • 关于有符号数与无符号数的建议
    • 练习1
    • 练习2

使用 位编码整数有两种不同的方式:

  1. 只能表示非负数(零、正数),即无符号数的编码
  2. 既能表示非负数,也能表示负数,即有符号数的编码补码编码

下表是一些数学术语,用于精确定义和描述计算机如何编码操作整数。

符号类型含义
B2TwB2T_wB2Tw函数二进制转补码
B2UwB2U_wB2Uw函数二进制转无符号数
U2BwU2B_wU2Bw函数无符号数转二进制
U2TwU2T_wU2Tw函数无符号数转补码
T2BwT2B_wT2Bw函数补码转二进制
T2UwT2U_wT2Uw函数补码转无符号数
TMinwTMin_wTMinw常数最小补码值
TMaxwTMax_wTMaxw常数最大补码值
UMaxwUMax_wUMaxw常数最大无符号数
+wt+^{t}_{w}+wt操作补码加法
+wu+^{u}_{w}+wu操作无符号数加法
∗wt*^{t}_{w}wt操作补码乘法
∗wu*^{u}_{w}wu操作无符号数乘法
−wt-^{t}_{w}wt操作补码取反
−wu-^{u}_{w}wu操作无符号数取反

下标w表示整数的位数。

整型数据类型

C语言支持多种整型数据类型——表示有限范围的整数。每种类型都可以用关键字指定大小,如charshortlong,同时还可以用unsigned表示是无符号的。
无符号数永远是>=0的。有符号数既能表示负数,又能表示非负数,在“典型”实现中,负数的表示范围比非负数大1(不对称)。

C语言标准定义了每种数据类型必须能够表示的最小取值范围。对有些数据类型则要求正数和负数的取值范围是对称的。
C/C++支持无符号数和有符号数,Java只支持有符号数。

无符号数的编码

假设一个整数有w位,其编码为[xw−1,xw−2,...,x0][x_{w-1}, x_{w-2}, ... , x_0][xw1,xw2,...,x0],写作位向量x⃗\vec xx。在这个编码中,每个位xix_ixi取值为01

原理:无符号数的编码定义。
对向量x⃗=[xw−1,xw−2,...,x0]\vec x = [x_{w-1}, x_{w-2}, ... , x_0]x=[xw1,xw2,...,x0],有
B2Uw(x⃗)=˙∑i=0w−1xi2i\begin{align} B2U_w(\vec x) \.=\displaystyle\sum_{i=0}^{w-1}x_i2^i \end{align} B2Uw(x)=˙i=0w1xi2i

=˙\.==˙表示左边被定义为等于右边。

函数 B2Uw(x⃗)B2U_w(\vec x)B2Uw(x)将一个长度为w0、1串映射为非负整数,函数的返回值就是该编码的无符号数值。

x⃗\vec xx所能表示的最小值为[0, 0, ..., 0]w0,该编码对应的无符号数值为0;最大值是[1, 1, ..., 1]w1,该编码对应的无符号数值为 UMaxw=˙B2Uw([1,1,...,1])=∑i=0i=w−12i=2w−1UMax_w \.= B2U_w([1, 1, ..., 1]) = \displaystyle\sum_{i=0}^{i=w-1}2^{i} = 2^w - 1UMaxw=˙B2Uw([1,1,...,1])=i=0i=w12i=2w1
因此,函数B2UwB2U_wB2Uw能够被定义为一个映射:{0,1}w→{0,1,2,...,2w−1}\{0, 1\}^w \to \{0, 1, 2, ..., 2^{w}-1\}{0,1}w{0,1,2,...,2w1}

原理:无符号数编码是唯一的。
函数B2UwB2U_wB2Uw是一个双射。
对函数 B2Uw(x⃗)B2U_w(\vec x)B2Uw(x)而言,给定一个位向量x⃗\vec xx,有唯一对应的无符号数值。
对函数 U2Bw(y)U2B_w(y)U2Bw(y)而言,给定一个无符号数值yyy,有唯一对应的位向量x⃗\vec xx

补码编码

最常见的有符号数的计算机表示方法是补码编码。在这个定义中,将最高有效位解释为权。
原理:补码编码定义。
对向量x⃗=[xw−1,xw−2,...,x0]\vec x = [x_{w-1}, x_{w-2}, ... , x_0]x=[xw1,xw2,...,x0],有
B2Tw(x⃗)=˙−xw−12w−1+∑i=0w−2xi2i\begin{align} B2T_w(\vec x) \.=-x_{w-1}2^{w-1} + \displaystyle\sum_{i=0}^{w-2}x_i2^i \end{align} B2Tw(x)=˙xw12w1+i=0w2xi2i
最高有效位xw−1x_{w-1}xw1也称为符号位,它的权重为−2w−1-2^{w-1}2w1xw−1x_{w-1}xw11时,该值是负数;为0时,该值是非负数。

x⃗\vec xx所能表示的最小值为[1, 0, ..., 0],值为TMinw=˙−2w−1TMin_w\.=-2^{w-1}TMinw=˙2w1;最大值为[0, 1, ..., 1],值为TMaxw=2w−1−1TMax_w=2^{w-1}-1TMaxw=2w11
因此,函数B2TwB2T_wB2Tw能够被定义为一个映射:{0,1}w→{−2w−1,−2w−1+1,...,2w−1−2,2w−1−1}\{0, 1\}^w \to \{-2^{w-1}, -2^{w-1} + 1, ..., 2^{w-1}-2, 2^{w-1}-1\}{0,1}w{2w1,2w1+1,...,2w12,2w11}

原理:补码编码是唯一的。
函数B2TwB2T_wB2Tw是一个双射。
对函数 B2Tw(x⃗)B2T_w(\vec x)B2Tw(x)而言,给定一个位向量x⃗\vec xx,有唯一对应的有符号数值。
对函数 T2Bw(y)T2B_w(y)T2Bw(y)而言,给定一个有符号数值yyy,有唯一对应的位向量x⃗\vec xx

相同的位向量 x⃗\vec xx 在不同的语境下有不同的含义。
如果 x⃗\vec xx[1, 1, ..., 1]的串,无符号数值语境下表示UMax,有符号数值语境下表示-1
如果 x⃗\vec xx[1, 0, ..., 0]的串,无符号数值下表示正数 2w−12^{w-1}2w1,有符号数值下表示负数 −2w−1-2^{w-1}2w1
最高位为0的情况下,无符号数值和有符号数值相等。

C语言标准并没有要求采用补码形式表示有符号数,但几乎所有的机器都是这么做的。如果程序员希望代码具有最大的可移植性,那么就该假定有符号数是采用补码编码的

补码:对于非负数x,用2w−x2^w - x2wx的值表示-x
反码:对于非负数x,用2w−1−x2^w - 1 - x2w1x的值表示-x

确定大小的整数类型

ISO C99标准定义了确定大小的整数类型。如int32_tuint64_t。无论在哪台机器上,它们都分别表示32位的有符号数和64位的无符号数。标准也定义了诸如INT32_MAXINT32_MINUINT64_MAX这样的宏,表示对应整数类型值的范围。标准也定义了诸如PRId32PRIu64这样的宏,表示格式化打印相应的整型变量时的宽度。

相比于C/C++Java标准定义更明确一些:仅支持有符号数、整型的表示范围确定、采用补码编码。

练习1

位向量 x⃗\vec xx 的长度w = 4,填写下表。

位向量 xB2UB2T
十六进制二进制
0xE[1110]14-2
0x0[0000]00
0x5[0101]55
0x8[1000]8-8
0xD[1101]13-3
0xF[1111]15-1

练习2

将下列使用32补码表示的16进制数转换成等价的10进制数。

  1. 0x2e0
    736
  2. -0x58
    -88
  3. 0x28
    40
  4. -0x30
    -48
  5. 0x78
    120
  6. 0x88
    136
  7. 0x1f8
    504
  8. 0xc0
    192
  9. -0x48
    -72

有符号数和无符号数之间的转换

相同位宽的有符号数和无符号数之间强制类型转换的结果是底层位值不变,但改变了解释这些位的方式。比如把short类型的-12345转换成unsigned short会得到53191,事实上这两个数的底层位值是一模一样的。再比如把UINT_MAX强转为有符号数会得到-1UINT_MAX-1的底层位值都是[1, 1, ..., 1]
因此,我们可以通过分析二进制表示,完成有符号数和无符号数之间的转换。

原理:从符号数转符号数。
对于位宽为w的有符号数xxx,二进制表示为位向量 x⃗\vec xx,满足TMinw<=x<=TMaxwTMin_w <=x<= TMax_wTMinw<=x<=TMaxw,有:
T2Uw(x)=˙B2Uw(T2Bw(x))=x+xw−12w={x+2w,x<0x,x>=0\begin{align} T2U_w(x)\.=B2U_w(T2B_w(x))= x+x_{w-1}2^w= \begin{cases} x+2^w, \quad &x<0 \\ x, \quad &x>=0 \end{cases} \end{align} T2Uw(x)=˙B2Uw(T2Bw(x))=x+xw12w={x+2w,x,x<0x>=0

有符号数的最高位权值是−2w−1-2^{w-1}2w1,无符号数的最高位权值是2w−12^{w-1}2w1,两者相差2w2^{w}2w。所以当最高位为1x<0x<0x<0)时,无符号数值比有符号数值大2w2^{w}2w

原理:从符号数转符号数。
对于位宽为w的无符号数xxx,二进制表示为位向量 x⃗\vec xx,满足0<=x<=UMaxw0<=x<= UMax_w0<=x<=UMaxw,有:
U2Tw(x)=˙B2Tw(U2Bw(x))=x−xw−12w={x,x<=TMaxwx−2w,x>TMaxw\begin{align} U2T_w(x)\.=B2T_w(U2B_w(x))=x-x_{w-1}2^w= \begin{cases} x, \quad &x<=TMax_w \\ x-2^w, \quad &x>TMax_w \end{cases} \end{align} U2Tw(x)=˙B2Tw(U2Bw(x))=xxw12w={x,x2w,x<=TMaxwx>TMaxw

当最高位为1x>TMaxwx>TMax_wx>TMaxw)时,有符号数比无符号数小2w2^w2w

练习

补充下面的表格。

xxxT2U4(x)T2U_4(x)T2U4(x)
-88
-313
-214
-115
00
55

C语言中的有符号数与无符号数

C语言中,声明一个常量时,默认是有符号的,如1230xAB。要创建无符号常量,需要加上后缀字符uU,如123u0xABu

可以显示转换,如:

int i;
unsigned int u;i = (int)u;
u = (unsigned int)i;

可以隐式转换,如:

int i;
unsigned int u;i = u;
u = i;

int i;
unsigned int u;printf("%u\n", i);
printf("%d\n", u);

当执行一个运算时,如果它的一个运算数是有符号的,另一个运算数是无符号的,那么C语言会隐式地将有符号参数转换为无符号数,再进行无符号数之间的运算。

练习

假设在采取补码运算的32位机器上执行以下运算,填写运算的类型和结果。

表达式类型求值
-2147483647-1 == 2147483648U无符号1
-2147483647-1 < 2147483647有符号1
-2147483647-1U < 2147483647无符号0
-2147483647-1 < -2147483647有符号1
-2147483647-1U < -2147483647无符号1

扩展一个数字的位表示

要将一个无符号整数转换为一个更大的数据类型,只需要简单地在高位加0,这种运算被称为无符号数的零扩展
要将一个有符号整数转换为一个更大地数据类型,需要在高位加符号位,这种运算被称为补码的符号扩展

当数据扩展和有无符号转换同时出现时,C标准要求先扩展、后进行有无符号转换

short sx = -12345;
unsigned int uy = sx;  // 等价于unsigned int uy = (unsigned int)(int)sx;
// uy的十六进制表示为0xFFFFCFC7

如果先做符号转换、再扩展,那uy的十六进制表示为0x0000CFC7,就无法正确表示原值sx的符号位。

练习1

下面各个补码对应的有符号数值是多少?

  1. [1011]
    −23+21+20=−5-2^3+2^1+2^0=-523+21+20=5
  2. [11011]
    −24+23+21+20=−5-2^4+2^3+2^1+2^0=-524+23+21+20=5
  3. [111011]
    −25+24+23+21+20=−5-2^5+2^4+2^3+2^1+2^0=-525+24+23+21+20=5

后两个有符号数分别是第一个有符号数符号扩展1位和2位的结果。符号扩展不会改变补码表示的数值大小。

练习2

考虑下面的C函数:

int fun1(unsigned word)
{return (int)((word << 24) >> 24);
}int fun2(unsigned word)
{return ((int)word << 24) >> 24;
}

填写下表。

wwwfun1(w)fun1(w)fun1(w)fun2(w)fun2(w)fun2(w)
0x000000760x000000760x00000076
0x876543210x000000210x00000021
0x000000C90x000000C90xFFFFFFC9
0xEDCBA9870x000000870xFFFFFF87

截断数字

当将一个w位的数截断为一个k位的数时,会丢弃高w-k位,并对低k位做新的解释。截断一个数可能会改变它的值(即溢出)。

练习

将一个4位数值截断为一个3位数值,填写下表。

十六进制无符号(十进制)补码(十进制)
原始值截断值原始值截断值原始值截断值
0x00x00000
0x20x22222
0x90x191-71
0xB0x3113-53
0xF0x7157-1-1

关于有符号数与无符号数的建议

整数的扩展和截断、有符号数和无符号数之间的隐式转换,会导致程序错误或漏洞。而这些不符合预期的行为有时很难被程序员发现。避免这些错误的方法有:

  1. 整数运算时,统一符号。
  2. 如果涉及到整数类型的变化,使用强制转换代替隐式转换,方便程序员发现问题。

练习1

考虑下面的代码,当length等于0时,预期结果是0.0。但实际上,运行时会造成一个内存错误。为什么?该如何修改代码?

float sum_elements(float a[], unsigned length)
{float result = 0;for (int i = 0; i <= length - 1; ++i) {result += a[i];}return result;
}

length是无符号数,i是有符号数,程序执行i <= length - 1时,程序会按无符号数执行该运算。
length = 0时,在无符号数的语境下,length - 1等于UINT_MAXi的值永远小于UINT_MAX,所以程序会访问未知内存,导致运行时错误。

解决办法是:

  1. length的类型改为int。当length = 0时,在有符号数的语境下,length - 1等于-1i的值是0,程序立即返回0.0
  2. i <= length - 1改为i < length

练习2

下面的代码用来判断一个字符串是否比另一个更长。在头文件stdio.h中,size_t无符号整型

// 库函数
size_t strlen(const char *s);// 用户代码
int strlonger(char *s, char *t)
{return strlen(s) - strlen(t) > 0;
}
  1. 在什么情况下,这个函数会产生不正确的结果?为什么?
    如果strlen(s)小于strlen(t)strlen(s) - strlen(t)的预期结果应该是个负数, strlen(s) - strlen(t) > 0的预期结果应该是0
    strlen(s)strlen(t)的返回值都是无符号数strlen(s) - strlen(t)的结果也是无符号数,无符号数一定是>=0的。因此程序会返回1,而不是0,和预期不符。
  2. 如何修改代码,使其正确。
    return strlen(s) - strlen(t) > 0;改为return strlen(s) > strlen(t);

相关文章:

【CSAPP】整数表示

文章目录整型数据类型无符号数的编码补码编码确定大小的整数类型练习1练习2有符号数和无符号数之间的转换练习C语言中的有符号数与无符号数练习扩展一个数字的位表示练习1练习2截断数字练习关于有符号数与无符号数的建议练习1练习2使用 位编码整数有两种不同的方式&#xff1a;…...

Python基础2

1. python函数定义 函数定义语法&#xff1a; def 函数名&#xff08;传入参数&#xff09;&#xff1a; 函数体 return 返回值 —————————————— 参数如果不需要&#xff0c;可以省略返回值如果不需要&#xff0c;可以省略函数必须先定义在使用 注意&#xff…...

【项目立项管理】

项目立项管理 很杂&#xff0c;可以根据左边的列表查看自己不会的 。。。 立项管理主要是解决项目的组织战略符合性问题 开发所需的成本和资源属于经济可行性 承建方组织资源和项目的匹配程度 内部立项目的&#xff1a; 为项目进行资源分配&#xff0c;确定项目绩效目标&am…...

【验证码的识别】—— 极验验证码的识别

前言 &#xff08;结尾有彩蛋欧&#xff09; 目前&#xff0c;许多网站采取各种各样的措施来反爬虫&#xff0c;其中一个措施便是使用验证码。随着技术的发展&#xff0c;验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码&#xff0c;后来加入了英文字母和混…...

华为OD机试 -旋转骰子(Python) | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 卡片组成的最大数字(Python) | 机试题算法思路 华为OD机试 - 网上商城优惠活动(一)(Python) | 机试题算法思路 华为OD机试 - 统计匹配的二元组个数(Python) | 机试题算法思路 华为OD机试 - 找到它(Python) | 机试题算法思路 华为OD机试…...

C生万物 | 模拟实现库函数strcpy之梅开n度

文章目录【梅开一度】&#xff1a;观察库函数strcpy()的实现【梅开二度】&#xff1a;模仿实现strcpy()【梅开三度】&#xff1a;优化简练代码【梅开四度】&#xff1a;assert()断言拦截【梅开五度】&#xff1a;const修饰常量指针【梅开六度】&#xff1a;还可以有返回值哦&am…...

家庭理财,轻松记账修改收支记录这样操作

我们在记账的时候难免会出现记错或者想修改的地方&#xff0c;又或者是想将之前太久没有用的记账记录删除掉&#xff0c;今天&#xff0c;小编就教大家如何修改收支记录&#xff0c;一起接着往下看吧&#xff01; 第一步&#xff0c;运行【晨曦记账本】在软件主界面中&#xff…...

河南工程学院2.17蓝桥杯培训

乘法口诀数列&#xff1a;https://www.acwing.com/problem/content/3466/ 剪绳子&#xff1a;https://www.acwing.com/problem/content/68Sin SinSine之舞&#xff1a;http://lx.lanqiao.cn/problem.page?gpidD5272 数列&#xff1a;https://www.acwing.com/problem/content/…...

【JavaSE】数据类型与变量

JAVA之父&#xff1a;詹姆斯高斯林 &#xff08;James Gosling&#xff09; 前言&#xff1a; 大家好&#xff0c;我是程序猿爱打拳。今天我给大家讲解的是Java基础中的数据类型。主要讲解的是各个类型的应用场景以及注意事项。 目录 1.数据类型 2.常量与变量 2.1常量 2.2变…...

生成模型技术发展过程

生成模型生成模型和判别模型的差异生成模型的目标是在给定了数据集D&#xff0c;并且假设这个数据集的底层分布(underlying distribution)是Pdata&#xff0c;我们希望够近似出这个数据分布。如果我们能够学习到一个好的生成模型&#xff0c;我们就能用这个生成模型为下游任务做…...

计算机网络第2章(物理层)学习笔记

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…...

4564: 保留尾部*

描述规定输入的字符串中只包含字母和*号&#xff0c;除了尾部的*号之外&#xff0c;请将字符串中其他*号全部删除。输入输入数据包括一串字符串&#xff0c;只包含字母和*&#xff0c;总长度不超过80。输出输出按要求删除*后的字符串。样例输入*******A*BC*DEF*G****样例输出AB…...

安卓项目搭建grpc环境

本篇文章使用的IDE是Android Studio。这里先吐槽一句&#xff0c;安卓项目搭建grpc环境&#xff0c;不管是引入插件还是引入第三方库&#xff0c;对于版本的要求都极为苛刻&#xff0c;一旦版本不匹配就会报错&#xff0c;所以对于版本的搭配一定要注意。 下面介绍的这个版本搭…...

Flink01: 基本介绍

一、什么是Flink 1. Flink是一个开源的分布式&#xff0c;高性能&#xff0c;高可用&#xff0c;准确的流处理框架 &#xff08;1&#xff09;分布式&#xff1a;表示flink程序可以运行在很多台机器上&#xff0c; &#xff08;2&#xff09;高性能&#xff1a;表示Flink处理性…...

设计模式之单例模式

文章の目录一、什么是单例模式二、如何实现单例模式1、利用JavaScript中的全局对象2、静态成员改造参考写在最后一、什么是单例模式 单例模式也称为单体模式&#xff0c;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 举个栗子&#xff1a;一个班级只有一…...

[oeasy]python0086_ASCII_出现背景_1963年_DEC_PDP系列主机_VT系列终端

编码进化 回忆上次内容 上次 回顾了 字符编码的新陈代谢 ibm 曾经的EBCDIC 由于 字符不连续导致 后续 出现无数问题 随着 网络的发展 数据交换的 需要原来的小隐患现在 产生了 巨大问题 Bemer 联合各方巨头 想要推出 字符连续的编码集 这新编码集 具体长什么样 呢&#xff1…...

基于FFmpeg实现的无声音屏幕录制

UI自动化测试时&#xff0c;有时需要进行录屏操作&#xff0c;这时我们是不需要声音的&#xff0c;我们可以通过FFmpeg进行简单的录制工作。 以下是在windows10环境下&#xff0c;基于FFmpeg实现的简单录制&#xff1a; Ffmpeg简介&#xff1a; 功能&#xff1a;有非常强大的…...

【项目精选】基于JSP物流信息网(论文+源码+视频)

点击下载源码 近年来&#xff0c;随着时代的进步&#xff0c;社会随之不断发展&#xff0c;经济也快速发展起来了&#xff0c;人民的消费水平在不断地提高&#xff0c;平常的实体店消费已经不能满足人们的需求&#xff1b;在者&#xff0c;互联网技术的不断发展也为电子商务的兴…...

linux异步IO编程实例分析

在Direct IO模式下&#xff0c;异步是非常有必要的&#xff08;因为绕过了pagecache&#xff0c;直接和磁盘交互&#xff09;。linux Native AIO正是基于这种场景设计的&#xff0c;具体的介绍见&#xff1a;KernelAsynchronousI/O (AIO)SupportforLinux。下面我们就来分析一下…...

日常英语口语练习-情景交际场景25(三)

登山踏青m: hey Carol&#xff0c; what are you doing this weekend?o: im going hiking /haikiŋ/登山with my husband and our hiking clubm: you have a hiking culb?o: yes, we do, we have 30 to 40 people of all ages and skill levelsm: thats great, do you gus do…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...