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

C语言中关于数据类型带来的陷阱

前言

笔者在阅读《深入理解计算机系统》时,理解了为何C语言被称为不安全语言,C语言除了指针非常灵活可能会导致大量漏洞之外,C语言的无符号数据也可能带来致命性危害。

扩展一个数据的表示

将一个无符号数转换为更大的数据类型,我们只需要在表示的开头添加0,这种运算称之为0扩展(zero extension),将一个补码数字转换为一个更大的数据类型可以执行符号扩展(sign extension)

因此我们可以看到,无符号表示的数和补码表示的数扩展方式不一样,这就会导致下面这种情况:

sx = -12345: cf c7

usx = 53191: cf c7

x = -12345: ff ff cf c7

ux = 53191: 00 00 cf c7

尽管-12345的补码表示和53191的无符号表示在16位字长时是相同的,但是在32位字长时却是不同的。前者使用的是符号拓展——最开头加了16位,都是最高有效位1,后者开头使用了16个0来扩展。

在书中有符号扩展,数值不变的数学证明过程,不感兴趣的小伙伴可以跳过这一部分。

B 2 T w + k ( [ x w − 1 , . . . , x w − 1 , x w − 1 , x w − 2 , . . . x 0 ] ) B2T_{w+k}([x_{w-1},...,x_{w-1},x_{w-1},x_{w-2},...x_0]) B2Tw+k([xw1,...,xw1,xw1,xw2,...x0]) = B 2 T w ( [ x w − 1 , x w − 2 , . . . , x 0 ] ) B2T_w([x_{w-1},x_{w-2},...,x_0]) B2Tw([xw1,xw2,...,x0])

上面这一条表达式左边增加了K个 x w − 1 x_{w-1} xw1,下面的证明是对k进行的归纳,即,我们只需证明拓展1次,即可通过数学归纳法证明上式正确

要证明:

B 2 T w + 1 ( [ x w − 1 , x w − 1 , x w − 2 , . . . , x 0 ] ) B2T_{w+1}([x_{w-1},x_{w-1},x_{w-2},...,x_0]) B2Tw+1([xw1,xw1,xw2,...,x0]) = B 2 T w ( [ x w − 1 , x w − 2 , . . . , x 0 ] ) B2T_w([x_{w-1},x_{w-2},...,x_0]) B2Tw([xw1,xw2,...,x0])

展开左边得到:

B 2 T w + 1 ( [ x w − 1 , x w − 1 , x w − 2 , . . . , x 0 ] ) = − x w − 1 2 w + ∑ i = 0 w − 1 x i 2 i = − x w − 1 2 w + x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i = − x w − 1 ( 2 w − 2 w − 1 ) + ∑ i = 0 w − 2 x i 2 i = B 2 T w ( [ x w − 1 , x w − 2 , . . . , x 0 ] ) \begin{aligned} B2T_{w+1}([x_{w-1},x_{w-1},x_{w-2},...,x_0]) &=\ -x_{w-1}2^{w}+\sum\limits^{w-1}_{i=0}x_{i}2^{i}\\ &=\ -x_{w-1}2^{w} + x_{w-1}2^{w-1} + \sum\limits^{w-2}_{i=0}x_{i}2^{i}\\ &=\ -x_{w-1}(2^{w} - 2^{w-1}) + \sum\limits^{w-2}_{i=0}x_{i}2^{i}\\ &=\ B2T_w([x_{w-1},x_{w-2},...,x_0])\\ \end{aligned} B2Tw+1([xw1,xw1,xw2,...,x0])= xw12w+i=0w1xi2i= xw12w+xw12w1+i=0w2xi2i= xw1(2w2w1)+i=0w2xi2i= B2Tw([xw1,xw2,...,x0])

不同大小的有无符号转变

当把short转换成unsigned时,我们先要改变大小,之后再完成从有符号到无符号的转变。

unsigned sx = unsigned int sx

因为是先改变大小,因此是先按照有符号的规则进行符号扩展,然后再从有符号转变成无符号。

截断数字

当我们强制类型转换将int修改为short,是直接将数字高位的相应部分直接截断,因此截断一个数字可能会改变它的值(溢出的部分没了)。截断它到k位的结果就相当于计算 x m o d e 2 k x mode 2^k xmode2k

关于有符号数与无符号数

有符号数到无符号数的隐式强制类型转换导致了某些非直观的行为。而这些非直观的特性经常导致程序错误,并且这种包含隐式强制类型转换细微差别的错误很难被发现。

下面给出两个例题:

请添加图片描述

根据上一篇文章得知,在无符号数与符号数之间的比较时,通通转换成无符号数比较。

可以看出,当usigned length 被设置为0时,在length - 1中,无符号数的减法是通过模运算实现的,因此不会得到负数,该表达式会变成UINT_MAX - 1(在32位系统中为0xFFFFFFFE,即4294967294),这么大的数进行遍历时,a数组的长度肯定是不够的,因此会遇到存储器错误,修改只需要将unsigned length改为int length即可

请添加图片描述

在此例题中,因为strlen函数返回值的数据类型为size_tunsigned int,因此涉及到无符号数据类型是要小心是否会转变成有符号类型,如果有,在转变时是否会发生与预期的数值产生偏差。

在此处,strlen(s)strlen(t)都是无符号类型,且进行大小比较,因此整个表达式都会转换成无符号类型进行比较。

在无符号类型中,0就是最小值,无论strlen(s)strlen(t)谁大谁小,相减也不会小于0,因此这个表达式只有在两者相等时为false,否则皆为true

函数getpreername的安全漏洞

2002 年,从事 FreeBSD 开源操作系统项目的程序员意识到,他们对 getpeername 函数的实现存在安全漏洞。代码的简化版本如下 :

请添加图片描述

​ 在这段代码里,第 7 行给出的是库函数 memcpy 的原型,这个函数是要将一段指定长度为 n的字节从存储器的一个区域复制到另一个区域。

​ 从第 14 行开始的函数 copy_from_kernel 是要将一些操作系统内核维护的数据复制到指定的用户可以访问的存储器区域。对用户来说,大多数内核维护的数据结构应该是不可读的,因为这些数据结构可能包含其他用户和系统上运行的其他作业的敏感信息,但是显示为 kbuf 的区域是用户可以读的。参数 maxlen 给出的是分配给用户的缓冲区的长度,这个缓冲区是用参数user_dest 指示的。然后,第 16 行的计算确保复制的字节数据不会超出源或者目标缓冲区可用的范围。

​ 不过,假设有些怀有恶意的程序员在调用 copy_from_kernel 的代码中对 maxlen 使用了负数值,那么,第 16 行的最小值计算会把这个值赋给 len,然后 len 会作为参数 n 被传递给 memcpy。不过,请注意参数 n 是被声明为数据类型 size_t 的。这个数据类型是在库文件stdio.h 中(通过 typedef)被声明的。典型地,在 32 位机器上被定义为 unsigned int。既然参数 n 是无符号的,那么 memcpy 会把它当作一个非常大的正整数,并且试图将这样多字节的数据从内核区域复制到用户的缓冲区。虽然复制这么多字节(至少 231 个)实际上不会完成,因为程序会遇到进程中非法地址的错误,但是程序还是能读到没有被授权的内核存储器区域。

​ 我们可以看到,这个问题是由于数据类型的不匹配造成的 :在一个地方,长度参数是有符号数 ;而另一个地方,它又是无符号数。正如这个例子表明的那样,这样的不匹配会成为缺陷的原因,甚至会导致安全漏洞。幸运的是,还没有案例报告有程序员在 FreeBSD 上利用了这个漏洞。他们发布了一个安全建议,“FreeBSD-SA-02:38.signed-error”,建议系统管理员如何应用补丁消除这个漏洞。要修正这个缺陷,只要将 copy_from_kernel 的参数 maxlen 声明为类型 size_t,也就是与 memcpy 的参数 n 一致。同时,我们也应该将本地变量 len 和返回值声明为 size_t。

​ 实际上,除了C语言,很少有语言支持无符号整数,很明显,设计者们认为它们带来的麻烦要比益处多得多。

​ 但当我们想把字仅仅看作时位的集合,并且没有任何数字意义时,无符号数值是非常有用的。例如,往一个字中放入描述各种布尔条件的标记时,就是这样。地址自然地就是无符号的,所以系统程序员发现无符号类型是很有帮助的。当实现模运算和多精度运算的数学包时,数字是由字的数组来表示的,无符号值也会非常有用。

相关文章:

C语言中关于数据类型带来的陷阱

前言 笔者在阅读《深入理解计算机系统》时,理解了为何C语言被称为不安全语言,C语言除了指针非常灵活可能会导致大量漏洞之外,C语言的无符号数据也可能带来致命性危害。 扩展一个数据的表示 将一个无符号数转换为更大的数据类型&#xff0c…...

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中,画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流(程)图 Data Flow Diagram,DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具,可以将…...

【AimRT】AimRT Hello World

目录 一、工程结构二、源码说明/CMakeLists.txt/cmake/GetAimRT.cmake/src/CMakeLists.txt/src/module/helloworld_module/CMakeLists.txt/src/app/helloworld_app/CMakeLists.txt/src/install/cfg/helloworld_cfg.yaml/src/module/helloworld_module/helloworld_module.h/src/…...

在Typora中实现自动编号

文章目录 在Typora中实现自动编号1. 引言2. 准备工作3. 自动编号的实现3.1 文章大纲自动编号3.2 主题目录(TOC)自动编号3.3 文章内容自动编号3.4 完整代码 4. 应用自定义CSS5. 结论 在Typora中实现自动编号 1. 引言 Typora是一款非常流行的Markdown编辑…...

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…...

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和…...

数据库设计

数据库设计全攻略:从理论到实践 在当今数字化驱动的世界里,数据已然成为企业和组织最为宝贵的资产之一。而数据库,作为数据的“栖息地”,其设计的优劣直接关系到整个信息系统的性能、可维护性以及能否高效满足业务需求。一个精心构思的数据库设计方案,就如同为一座高楼打…...

三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇

一、引言 1.1 研究背景与意义 在当今医疗领域,三甲医院作为医疗服务的核心载体,肩负着保障民众健康、推动医学进步的重任。随着信息技术的飞速发展,数据已成为医院运营管理、医疗质量提升以及科学决策的关键要素。三甲医院等级评审作为衡量医院综合实力与服务水平的重要标…...

【2025软考高级架构师】案例题重点知识——第一部分

1.架构风格相关问题 什么是架构风格? 软件架构风格类似于建筑风格,从相同类型的软件系统中抽取其架构的共性,是一种惯用模式,反映了众多系统共有的结构和语义 (1)软件架构为软件系统提供了一个结构、行为和属性的高级抽象。 (2)软件架构风格是特定应用领域的惯用模式,架…...

Science Robotics让软机器人“活”得更久的3D打印!

软机器人硬件在医疗、探索无结构环境等领域有广泛应用,但其生命周期有限,导致资源浪费和可持续性差。软机器人结合软硬组件,复杂组装和拆卸流程使其难以维修和升级。因此,如何延长软机器人的生命周期并提高其可持续性成为亟待解决…...

【JVM】总结篇-运行时内存篇

文章目录 JVM内存模型(内存结构)程序计数器 pc虚拟机栈本地方法栈 native堆堆空间堆中一些JVM参数堆中垃圾回收过程MinorGC MajorGC FullGC年轻代GC(Minor GC)触发机制:老年代GC(Major GC/Full GC)触发机制&#xff1a…...

【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

【数据仓库】hive on Tez配置

hive on Tez 搭建 前提是hive4.0hadoop3.2.2数仓已搭建完成,现在只是更换其执行引擎 为Tez。搭建可参考【数据仓库】hive hadoop数仓搭建实践文章。 Tez 下载 下载地址 https://archive.apache.org/dist/tez/ 官网地址 https://tez.apache.org/releases/apac…...

基于HTML和CSS的旅游小程序

一、技术基础 HTML(HyperText Markup Language):超文本标记语言,用于定义网页的内容和结构。在旅游小程序中,HTML用于搭建页面的基本框架,包括标题、段落、图片、链接等元素,以及用于交互的表单…...

CDP集成Hudi实战-文件存储布局实况讲解

[〇]关于本文 本文我们参考一张在hdfs中的hud表讲解一下hudi表的文件存储布局 [一]时间线文件解析 目录结构中列出的文件和子目录如下&#xff1a; 1-文件类型解析 时间线目录中的文件主要有以下几种类型&#xff1a; <commit_id>.deltacommit.inflight 表示一项事务&…...

22408操作系统期末速成/复习(考研0基础上手)

第一部分:计算题&#xff1a; 考察范围&#xff1a;&#xff08;标红的是重点考&#xff09; 第一章&#xff1a;CPU利用率&#xff1a; 第二章&#xff1a; 进程调度算法&#xff08;需要注意不同调度算法的优先级和题目中给出的是否可以抢占【分为可抢占和不可抢占&#xff…...

Qt的信号与槽

文章目录 信号与槽机制信号与槽的定义 Qt使用信号与槽机制进行对象间的通信。当某个对象的状态发生变化时&#xff0c;该对象会触发一个信号。 该信号和另外一些对象的槽函数绑定&#xff0c;信号的触发将导致这些槽函数的执行&#xff0c;以处理第一个对象状态的变化。触发信号…...

牛客网刷题 ——C语言初阶——JZ15 二进制中1的个数

1.题目描述 题目OJ链接 描述 输入一个整数 n &#xff0c;输出该数32位二进制表示中1的个数。其中负数用补码表示。 2.思路 求2进制中1的个数&#xff0c;可以转换为求每一位&#xff0c;1的个数&#xff0c;1&1还是1 所以判断如果该数值&1为真&#xff0c;我们就co…...

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…...

Elasticsearch Serverless中的数据流自动分片深度解析

Elasticsearch Serverless中的数据流自动分片深度解析 一、Elasticsearch Serverless概述 1. 什么是Elasticsearch Serverless Elasticsearch Serverless是一种云端全托管的Elasticsearch服务&#xff0c;它基于云原生Serverless技术架构&#xff0c;提供自动弹性和完全免运…...

Elasticsearch JavaRestClient版

文章目录 初始化RestHighLeveClient&#xff08;必要条件&#xff09;索引库操作1.创建索引库&#xff08;4步&#xff09;2.删除索引库&#xff08;3步&#xff09;3.判断索引库是否存在&#xff08;3步&#xff09;4.总结&#xff1a;四步走 文档操作1.创建文档&#xff08;4…...

通过爬虫方式实现视频号助手发布视频

1、将真实的cookie贴到解压后目录中cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年1月份最新版; 代码如下: import json import…...

如何在VMware ESXi和Workstation中打开VMDK文件?

VMware 中的 VMDK 是什么&#xff1f; 在 VMware 中&#xff0c;VMDK 是虚拟磁盘文件的格式&#xff0c;全称是 Virtual Machine Disk。VMDK 文件用于存储虚拟机的硬盘内容&#xff0c;包括操作系统、应用程序、文件等。它相当于虚拟机的硬盘驱动器&#xff0c;可以模拟出各种…...

【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练

GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…...

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…...

JVM学习指南(9)-JVM运行时数据区

JVM学习指南(9)-JVM运行时数据区 引言 Java虚拟机(JVM)是Java程序运行的核心,它为Java程序提供了一个与平台无关的执行环境。JVM的重要性不仅在于它实现了Java的跨平台特性,还在于它对程序执行过程中内存的管理。JVM运行时数据区是程序执行过程中存储数据的关键区域,理解…...

前端实现大文件上传(文件分片、文件hash、并发上传、断点续传、进度监控和错误处理,含nodejs)

大文件分片上传是前端一种常见的技术&#xff0c;用于提高大文件上传的效率和可靠性。主要原理和步骤如下 文件分片 确定分片大小&#xff1a;确定合适的分片大小。通常分片大小在 1MB 到 5MB 之间使用 Blob.slice 方法&#xff1a;将文件分割成多个分片。每个分片可以使用 Bl…...

什么是 C++ 的序列化?

什么是 C 的序列化&#xff1f; 序列化&#xff08;Serialization&#xff09;是指将对象的状态转换为可以存储或传输的格式的过程。它使得对象能够以二进制或文本的形式被保存到文件中&#xff0c;或者通过网络发送到远程计算机上&#xff0c;稍后可以重新构造出来&#xff0…...

047_小驰私房菜_Qcom 8系列,Jpeg GPU 旋转

【问题背景】 横屏模式下&#xff0c;发现有些三方app拍照旋转了90度。 【修改策略】 adb shell setprop endor.debug.camera.overrideGPURotationUsecase 1 或者在/vendor/etc/camera/camxoverridesettings.txt 里面添加如下内容 overrideGPURotationUsecase1 【解释】 Ga…...

【C++】2039:【例5.6】冒泡排序

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的初步实现我的代码实现问题分析 &#x1f4af;老师的实现方式老师代码的特点分析老师代码的执行过程 &#x1f4af;我的代码与老师代码的对比优点…...

【Java回顾】Day4 反射机制

反射机制 之前学过一部分&#xff0c;笔记在20250103Java包_网络编程.md里,这里在之前的笔记的基础上做一些补充。 反射&#xff1a;得到class对象后反向获取对象的各种信息。 包 Field 类或接口中的字段(成员变量)&#xff0c;动态访问和修改类的字段 模板 获取Class 对象 …...

MATLAB画柱状图

一、代码 clear; clc; figure(position,[150,100,900,550])%确定图片的位置和大小&#xff0c;[x y width height] %准备数据 Y1[0.53,7.9,8.3;0.52,6.8,9.2;0.52,5.9,8.6;2.8,5.8,7.9;3.9,5.2,7.8;1.8,5.8,8.4]; % withoutNHC X11:6; %画出4组柱状图&#xff0c;宽度1 h1…...

web漏洞之文件包含漏洞

一、文件包含漏洞 1、把DVWA页面改为low级别&#xff0c;然后点击File Inclusion页面 原理是File Inclusion页面访问的是low.php和include.php&#xff0c;这两个页面包含了include($_GET[page])这句话&#xff0c;意思是page会把用户输入的参数带进来然后由$_GET读取&#x…...

spring mvc源码学习笔记之六

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...

深入理解 PyTorch 的 Dataset 和 DataLoader:构建高效数据管道

文章目录 简介PyTorch 的 DatasetDataset 的基本概念自定义 Dataset实现 __init__ 方法示例&#xff1a;从 CSV 文件加载数据 实现 __len__ 方法实现 __getitem__ 方法另一种示例&#xff1a;直接传递列表训练集和验证集的定义 1. 单个 Dataset 类 数据分割2. 分别定义两个 Da…...

VSCode设置ctrl或alt+mouse(left)跳转

总结&#xff1a; &#xff08;1&#xff09;VSCode初次远程连接服务器时&#xff0c;需要在服务器上下载 python 拓展&#xff0c;然后选择对应的环境 &#xff08;2&#xff09;VSCode设置ctrl或altmouse(left)跳转到定义...

在Ubuntu 18.04.6 LTS安装OpenFace流程

一、修改配置:将gcc8&#xff0c;g8作为默认选项 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 sudo update-alternatives --config gcc 选择版本&#xff0c;再查看gcc --version sudo update-alternatives --install /usr/bin/g g /usr/bin/g-…...

微服务拆分的艺术:构建高效、灵活的系统架构

目录 一、微服务拆分的重要性 二、微服务拆分的策略 1. 按照业务领域拆分 2. 按照团队结构拆分 3. 按照业务边界拆分 4. 按照数据和数据库拆分 5. 按照用户界面或外部接口拆分 6. 按照功能模块或领域驱动设计拆分 7. 按照性能和可伸缩性需求拆分 三、微服务拆分的实践…...

PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)

文章目录 发送消息原理说明发送功能实现html部分javascript代码PHP代码 发送消息原理说明 接下来我们发送聊天的文本信息。点击发送按钮的时候&#xff0c;会自动将文本框里的内容发送出去。过程是我们将信息发送到服务器&#xff0c;服务器再转发给对方。文本框的id为msgcont…...

java项目之读书笔记共享平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 读书笔记共享平台的主要使…...

RabbitMq的Java项目实践

在现代软件开发中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;作为一种重要的组件&#xff0c;承担着上下游消息传递和通信的重任。RabbitMQ作为一款流行的开源消息队列中间件&#xff0c;凭借其高可用性、可扩展性和易用性等特点&#xff0c…...

气膜球幕:引领元宇宙时代的科技与艺术光影盛宴—轻空间

在科技与艺术交织的时代&#xff0c;未来的观影体验将不再受限于传统屏幕的束缚。随着气膜球幕的崭新亮相&#xff0c;突破性的光影效果和沉浸式体验让我们走进了一个全新的视听世界。这不仅仅是一个简单的球形影院&#xff0c;它是连接现实与虚拟、科技与艺术、光与影的桥梁&a…...

行为模式2.命令模式------灯的开关

行为型模式 模板方法模式&#xff08;Template Method Pattern&#xff09;命令模式&#xff08;Command Pattern&#xff09;迭代器模式&#xff08;Iterator Pattern&#xff09;观察者模式&#xff08;Observer Pattern&#xff09;中介者模式&#xff08;Mediator Pattern…...

Linux环境下静态库和动态库的实现

Linux 环境下静态库和动态库的实现 在软件开发中&#xff0c;库是非常重要的组成部分。它们包含了一组可复用的函数和代码片段&#xff0c;用于提高开发效率和代码质量。在Linux系统中&#xff0c;库分为静态库和动态库两种。本文将介绍它们的实现方式&#xff0c;结合C语言代…...

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能&#xff0c;选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其&#xff0c;在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换&#xff0c;特别方便。VS文件另…...

Tortoisegit 安装之后没有Add、ignore解决

在本地的仓库文件夹中点击右键&#xff0c;找到Settings&#xff0c; 从General 找到Contex Menu&#xff0c;我的系统是Win11&#xff0c;所以用Win11 Contex Menu 将所需要的操作打勾即可。...

线性代数考研笔记

行列式 背景 分子行列式&#xff1a;求哪个未知数&#xff0c;就把b1&#xff0c;b2放在对应的位置 分母行列式&#xff1a;系数对应写即可 全排列与逆序数 1 3 2&#xff1a;逆序数为1 奇排列 1 2 3&#xff1a;逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…...

C语言带参数的宏定义的相关知识汇总(最常用的形式、带标记分隔符##的形式...)

阅读大型C工程代码时&#xff0c;绕不开带参数的宏定义的阅读&#xff0c;所以有必要强化一下这一块的知识。 01-带参数的宏定义最常用的形式 # define S(a,b) a*b ... ... ... area S(3,2);则在编译预处理时area S(3,2);被展开为&#xff1a; area 3 * 2;02-带标记分隔符…...

cpp编译链接等

一、编译预处理 C程序编译的过程&#xff1a;预处理 -> 编译&#xff08;优化、汇编&#xff09;-> 链接 预处理指令主要有以下三种&#xff1a; 包含头文件&#xff1a;#include 宏定义&#xff1a;#define&#xff08;定义宏&#xff09;、#undef&#xff08;删除宏…...

openbmc sdk09.03 适配(一)

1.说明 本节是根据最新的sdk09.03适配ast2600平台。 sdk下载路径为: https://github.com/AspeedTech-BMC/openbmc可参阅文档: https://blog.csdn.net/wit_yuan/article/details/144613247nfs挂载方法: # mount -o nolock -t nfs serverip:/xx...