char/uchar类型越限总结

article/2025/10/12 5:48:44

我们在文章一和文章二中分析了char和uchar的取值范围和越限的情况。

总结:

1、char/uchar本质是保存的整型数,一个字节的整型数;//所谓的字符型,其实是将整型作为ascii码转换成的字符。

2、uchar的取值范围

  • 十进制:0至255
  • 十六进制:0至FF

3、char的取值范围

  • 十进制:-128至127
  • 十六进制:80至7F

4、char/uchar类型越限:

口诀:高减低加(加减256,类似十进制数的加减10,即:加减循环周期)

  • 十进制:当数据高于最大上限,则减256;当数据低于最小下限,则加256;

例如:

    char ch1 = 129;//129-256=-127;char ch2 = -130;//-130+256=126;uchar ch3=257;//257-256 =1;uchar ch4 = -2;//-2+256= 254;printf("%d,%d,%d,%d",ch1,ch2,ch3,ch4);

思路:32位编译器:

思路一:129-----》补码:0000 0000 0000 0000 0000 0000 1000 0001---->截取后8位1000 0001,因为是char类型,最高位是1,扩展为%d,符号位补1,1111 1111 1111 1111 1111 1111 1000 0001-》

转换为源码:1000 0000 0000 0000 0000 0000 0111 1111   ----》-127

思路二:129 = 127+2 -----》参考下图,最大的数127,顺移2个位置是-127;

思路一:-130---》补码:1111 1111 1111 1111 1111 1111 0111 1110-----》截取后8位 0111 1110,最高位为0,则使用%d(及扩展为4字节的int)显示: 0000 0000 0000 0000 0000 0000 0111 1110---》126

思路二:-130= -128-2---》参考上图,最小数,逆移2个位置为126;

思路一:257---》补码:0000 0000 0000 0000 0000 0001 0000 0001----》截取后8位:0000 0001,因为位uchar,扩展为%d,0000 0000 0000 0000 0000 0000 0000 0001---->1

思路二:257=255+2---》最大数,255顺移两个位置得1(uchar范围从0-255)

思路一:-2----->补码:1111 1111 1111 1111 1111 1111 1111 1110-------》截取后8位:1111 1110,因为是uchar,扩展为%d,符号位补0,所以是254

思路二:-2=0-2--------》顺移2个位置是254

  • char的十六进制数越限(看成十进制数,char是越限了,但其实该十六进制数在80-7F之间的(1000 0000------0111 1111,这是256个数,包含了以0开头和以1开头的所有的数),并未越限
    uchar ch1 = 0xAA;char ch2 = 0xAA;printf("%d,%d\n%x,%x",ch1,ch2,ch1,ch2);

 

同样的十六进制数(也就是二进制数1010 1010),将其赋给uchar类型是170,赋给char类型是-86;无论是赋给什么值,十六进制数本身是不变的。

ps:

1)我们发现,将uchar 0xAA和char 0xAA 以十六进制形式打印出来的时候,是有区别的,原因是:

uchar, 0xAA是一个正数,相当于前面都是0,故是0xAA;

char,0xAA(10101010,其实这个数也没有越限,因为首位是1,所以是个负数,因为是在32位机上打印出来的整型占4个字节,所以,拓展为32位,前面都是F),这其实是一个短字节数转换成长字节数的问题。

2)char ch2=0xAA;以%d的形式,即以十进制形式打印出来的话,最终是多少就要将十六进制转换成十进制,然后按照“高减低加”的方式算出最多是多少。

3)对于uchar/char,如果是以一个字节的十六进制数赋值的话,我们赋值是多少,以十六进制输出就是多少(%x,无符号十六进制打印,十六进制不同于十进制的正负号%d/%u,只有无符号。),对于char/uchar,如果赋值的是一个8位的十六进制数,是不存在越限的。

所以,我们习惯于使用char/uchar来存储十六进制数,因为所见即所得。

4)对于uchar/char,我们以一个字节的十六进制数赋值,直接算的话是源码。

5)uchar的范围是从0至255共256个数,char的范围是从80至7F共256个数,相较与uchar,从80至FF从原先表示正数,现在用来表示负数。

5、当uchar/char数据为十进制数时,以十六进制形式输出的是补码形式。(当uchar/char数据为十六进制数时,以十六进制形式原样输出。)

    char ch1 = 129;//129-256=-127;char ch2 = -130;//-130+256=126;uchar ch3=257;//257-256 =1;uchar ch4 = -2;//-2+256= 254;printf("%d,%d,%d,%d\n",ch1,ch2,ch3,ch4);printf("%x,%x,%x,%x\n",ch1,ch2,ch3,ch4);char ch5 = -127;char ch6 = 126;uchar ch7=1;uchar ch8 = 254;printf("%d,%d,%d,%d\n",ch5,ch6,ch7,ch8);printf("%x,%x,%x,%x\n",ch5,ch6,ch7,ch8);

总总结:

1)十进制数,以十进制形式输出,“高减低加”;

2)十进制数,以十六进制形式输出,先“高减低加”,然后,转换成补码输出;

3)十六进制数,以十进制形式输出,转换成十进制数,“高减低加”输出;

4)十六进制数,以十六进制形式输出,原样输出,注意符号补位。


http://chatgpt.dhexx.cn/article/yv1cpTrH.shtml

相关文章

【机器学习】高斯混合模型详解

目录 1 引言2 高斯混合模型2.1 高斯分布2.2 高斯混合模型 3 高斯混合模型的求解4 参考文献 1 引言 高斯混合模型(Gaussian Mixture Model, GMM)是单一高斯概率密度函数的延伸,GMM能够平滑地近似任意形状的密度分布。学习高斯混合模型主要是因…

高斯混合模型聚类(GMM)matlab实现

Gaussian Mixture Model ,就是假设数据服从 Mixture Gaussian Distribution ,换句话说,数据可以看作是从数个 Gaussian Distribution 中生成出来的。实际上,我们在 K-means 和 K-medoids 两篇文章中用到的那个例子就是由三个 Gaus…

混合模型简介与高斯混合模型

高斯混合模型 混合模型概述 In statistics, a mixture model is a probabilistic model for representing the presence of subpopulations within an overall population, without requiring that an observed data set should identify the sub-population to which an indi…

GMM高斯混合模型

GMM高斯混合模型 一、GMM简介 GMM 全称是高斯混合模型,顾名思义,其本质就是将n个高斯模型混合叠加在一起,主要用处是用来作异常检测,聚类等;优点就是可解释性好,在低维数据上有着不错的效果; …

matlab构建高斯混合模型,使用matlab创建高斯混合模型及绘图

Matlab提供了根据几个独立的高斯模型创建Gaussian Mixture Model(GMM)的函数,即fitgmdist。关于该模型的具体使用方法以及绘制生成的GMM的图形的方法,如下代码所示: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%…

使用高斯混合模型的点云配准

最近在学习基于概率模型的点云配准方法,上一篇中学习的是基于NDT(Normal Distribution Transform)的点云配准方法,其中关键是将点云进行体素单元格划分,并将每个体素单元格用一个概率密度函数表示。 今天读了另一篇论…

sklearn之高斯混合模型

什么是高斯分布? 高斯分布也叫正态分布,也就是常态分布,什么意思呢?比如说男性的身高,假如说有10000个男性的身高,如果再坐标系上标记出来就是一个正态分布,如果形状还不是和上面的图形一样&am…

基于高斯混合模型的目标检测算法matlab仿真

目录 一、理论基础 二、核心程序 三、仿真结论 一、理论基础 高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。 对图像背景建立…

高斯混合模型 GMM 的详细解释

高斯混合模型(后面本文中将使用他的缩写 GMM)听起来很复杂,其实他的工作原理和 KMeans 非常相似,你甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。 因为KMeans的限制很多…

高斯混合模型学习笔记

高斯混合模型学习笔记 根据师兄(王延凯的博客)以及其他博主大佬的总结学习高斯混合模型,自己也作一下学习记录。 目录 高斯混合模型学习笔记1、模型介绍2、模型求解步骤举个栗子通用背景模型UBM[\[2\]](https://blog.csdn.net/weixin_44278…

机器学习笔记之高斯混合模型(一)模型介绍

机器学习笔记之高斯混合模型——模型介绍 引言高斯混合模型介绍示例介绍从几何角度观察高斯混合模型从混合模型的角度观察 概率混合模型的引出从概率生成模型的角度观察高斯混合模型 引言 上一系列介绍了EM算法,本节将介绍第一个基于EM算法求解的概率生成模型——高…

图像处理之高斯混合模型

一、高斯混合模型 现有的图像中目标的分类常用深度学习模型处理,但是深度学习需要大量模型处理。对于明显提取的目标,常常有几个明显特征,利用这几个明显特征使用少量图片便可以完成图像目标分类工作。这里介绍使用高斯混合模型GMM处理图像。…

机器学习 高斯混合模型

高斯混合模型 前言高斯混合模型高斯分布混合模型高斯模型单高斯模型高斯混合模型高斯混合模型训练EM算法 应用图像背景的高斯混合模型智能监控系统 参考 前言 之前在一次技术讨论当中,针对文本处理的时候被问到高斯混合模型。当时我对“高斯混合模型”都是比较懵圈…

高斯混合模型GMM

1. 高斯混合模型概念 高斯混合模型(Gaussian Mixture Model)是一种聚类算法,它是多个高斯分布函数的线性组合,通常用于解决同一集合下的数据包含多种不同的分布情况。 2.高斯混合模型的一个例子 在校园里随机抽取2000个学生&#…

高斯混合模型

一、什么是高斯混合模型(GMM) 高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,通常用于解决同一集合下的数据包含多个不同的分布的情况,如解决分类情况 如下图,明显分成两…

【技术分享】高斯混合模型

本文原作者:尹迪,经授权发布。 原文链接:https://cloud.tencent.com/developer/article/1480731 导语:现有的高斯模型有单高斯模型(SGM)和高斯混合模型(GMM)两种。从几何上讲&#…

高斯混合模型(GMM)

高斯混合模型 k-means 聚类模型非常简单并且易于理解,但是它的简单性也为实际应用带 来了挑战。特别是在实际应用中,k-means 的非概率性和它仅根据到簇中心点的距离来指 派簇的特点将导致性能低下。这一节将介绍高斯混合模型,该模型可以被看…

机器学习笔记 - 什么是高斯混合模型(GMM)?

1、高斯混合模型概述 高斯混合模型 (GMM) 是一种机器学习算法。它们用于根据概率分布将数据分类为不同的类别。高斯混合模型可用于许多不同的领域,包括金融、营销等等!这里要对高斯混合模型进行介绍以及真实世界的示例、它们的作用以及何时应该使用GMM。 高斯混合模型 (GMM) …

机器学习算法(二十九):高斯混合模型(Gaussian Mixed Model,GMM)

目录 1 混合模型(Mixture Model) 2 高斯模型 2.1 单高斯模型 2.2 高斯混合模型 3 模型参数学习 3.1 单高斯模型 3.2 高斯混合模型 4 高斯混合模型与K均值算法对比 1 混合模型(Mixture Model) 混合模型是一个可以用来表示在总…

重启虚拟机异常:Unmount and run xfs_repair

重启虚拟机异常:Unmount and run xfs_repair 解决办法: 原因:看出来应该是sda3分区损坏,修复就可以了 1:启动虚拟机E进入单用户模式 2:在linux16开头的哪一行后面添加rd.break,ctrlx进入救援模式…