char 和 unsigned char 的区别

article/2025/10/15 3:04:01

一.基本原理

1、char取值范围是 -128~+127。

2、我们先来看 signed char的最大值。  

最高位是 符号位, 0 代表正数; 1 代表负数。0 1 1 1  1 1 1 1     这个值等于 2^0 + 2^1 + 2^2  + 2^3  + 2^4  + 2^5  + 2^6  = 127  。 也有一个简便计算方法:2^7 -1 = 128-1 =127   所以,signed char 的最大值是 127 。

singed char 的最小值计算。 在计算机中,数值是以补码形式存储的。正数的补码是其本身; 而负数的补码是 取反 (符号位保持不变),再加1。

我们先来看 -1 的存储过程:

-1: 1 0 0 0 0 0 0 1 ->(取反) 1 1 1 1 1 1 1 0 ->(加1) 1 1 1 1 1 1 1 1

-2: 1 0 0 0 0 0 1 0 ->(取反) 1 1 1 1 1 1 0 1 ->(加1) 1 1 1 1 1 1 1 0

-3: 1 0 0 0 0 0 1 1 ->(取反) 1 1 1 1 1 1 0 0 ->(加1) 1 1 1 1 1 1 0 1

… …

-127 1 1 1 1 1 1 1 1 ->(取反) 1 0 0 0 0 0 0 0 ->(加1) 1 0 0 0 0 0 0 1

-128 1 0 0 0 0 0 0 0 ->(取反) 1 1 1 1 1 1 1 1 ->(加1) 1 0 0 0 0 0 0 0

不管是原码还是补码, 总会出现 -0 这个值。 本来 +0 与 -0 是没有区别的。 但对于存储器和编译器来讲,总得充分利用每个字节吧, 更不想出现二义性。 所以,将 -0 表示为 -128 , 这样既增大了signed char 数值的表示范围,又消除了 -0 的二义性。

所以signed char的取值范围是 -128~127。

3.unsigned char没有符号位  最大值是  255(1 1 1 1 1 1 1 1)

我们看下下面的代码测试程序,就会清晰很多了

#include<iostream>
using namespace std;
int main(int argc, char * argv[])
{//正数在计算机中存储的是源码,而负数存储的是补码//在赋值的过程中,就是把计算机中存储的内容直接赋给对应的变量//只是有符号数直接会把他当成补码处理,再对其进行减一取反操作//至少在我这里是这样的看的。然后看他的符号位。//没符号的数  就会直接按照源码处理,因为没有符号位,直接翻译过来。//对于负数计算机存储的是补码,而对于正数计算机存储的是源码char a = 0x81;/*//这里就匹配不上了,因为0x81 在计算机存储的是源码 1 0 0 0 0 0 0 1而赋值给一个有符号的char 会当作补码进行处理,先对其减一1 0 0 0 0 0 0 0,再对除符号位外进行取反。1 1 1 1 1 1 1 1,然后得到解析数值 -127,显然-127和+129显然是不相等的。这里同时要注意在a的地址里存储的还是  10000001,只是把这个解析成补码了*/if (a == 0x81){printf("you are matched!!!\n");}printf("a is %d\n", a);//对其赋值给 unsigned char的时候,是会直接把a中在内存中存储的值//10000001,而赋值给 unsigned char之后,unsigned char之后会当//源码进行解析,则又恢复了原来的129.unsigned char w = a;printf("w is %d\n", w);/*-1 在计算机中按照补码存储  存储的数值是 11111111把这个值赋值给一个 unsigned char 之后就会按照源码处理没有符号位翻译成了 255*/char testc = -1;unsigned char test_uc = testc;printf("test_uc =%d\n", test_uc);return 0;
}

输出内容如下:

a is -127
w is 129
test_uc =255

二.printf 输出的影响

在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的。如果要定义无符号类型,必须显式地在变量类型前加unsigned。

char vs unsigned char
相同点:在内存中都是一个字节,8位(2^8=256),都能表示256个数字
不同点:char的最高位为符号位,因此char能表示的数据范围是-128~127,unsigned char没有符号位,因此能表示的数据范围是0~255

实际使用中,如普通的赋值,读写文件和网络字节流都没有区别,不管最高位是什么,最终的读取结果都一样,在屏幕上面的显示可能不一样。

但是要把一个char类型的变量赋值给int、long等数据类型或进行类似的强制类型转换时时,系统会进行类型扩展,这时区别就大了。对于char类型的变量,系统会认为最高位为符号位,然后对最高位进行扩展,即符号扩展。若最高位为1,则扩展到int时高位都以1填充对于unsigned char类型的变量,系统会直接进行无符号扩展,即0扩展。扩展的高位都以0填充。所以在进行类似的操作时,如果char和unsigned char最高位都是0,则结果是一样的,若char最高位为1,则结果会大相径庭。

#include <stdio.h>
/*
%d,%c,%s,%x是程序汇编语言中的格式符,它们的含义:1、%d表示按整型数据的实际长度输出数据。//不会进行扩展到四个字节2、%c用来输出一个字符。就输出一个字节里的内容,然后得到数值,不关心符号位,直接把对应的二进制变成一个正数
//找对应的acs码符号
3、%x表示以十六进制数形式输出整数。
//会扩展到四个字节 char类型的负数赋值给他影响较大,
所有高位都会扩展为1,其他位都不变(包括原来的符号位)
这个一般的办法是把高位清零来看,就是与0xff想与4、%u表示以无符号十进制整数形式输出整数。
//会扩展到四个四节
char类型的负数赋值给他影响较大,
所有高位都会扩展为1,其他位都不变(包括原来的符号位)*/
static void func(unsigned char uc)
{char c;int i, j;unsigned int ui, uj;c = uc;i = (int)c;j = (int)uc;ui = (unsigned int)c;uj = (unsigned int)uc;printf("%%d: %d, %d\n", c, uc);//-128,  //128printf("%%c: %c, %c\n", c, uc);//直接输出二进制对应的数值printf("%%x: %x, %x\n", c, uc);//-80   //)0X80printf("%%u: %u, %u\n", ui, uj);//128     //128printf("%%d: %d, %d\n", i, j);//-128    //128printf("-------------------\n");
}int main(int argc, char *argv[])
{func(0x80);func(0x7f);int a = -2;printf("a is :\n %%x:%x\n %%d:%d \n %%u:%u \n", a,a,a);return 0;
}


输出结果如下:

暂时总结到这里


http://chatgpt.dhexx.cn/article/5Frr9rNg.shtml

相关文章

C/C++ unsigned char*类型

C unsigned char &#xff0a;是表示无符号字符指针的意思。 细节如下&#xff1a; char 前面添加unsigned表示是无符号的字符&#xff0c;也就是不可以存储负数&#xff1b; 在数据类型后面加&#xff0a;表示指针的意思&#xff1b; 指针是C和C的一种特色数据类型&#x…

C/C++ unsigned 详细探讨

unsigned常应用于无符号数的表示&#xff0c;初学者可能并不知道其在具体应用中的潜在威胁&#xff0c;本文通过一些实例来具体说明。 unsigned char text_digit -11; unsigned修饰无符号数&#xff0c;-11的补码是11的原码&#xff08;0000 1011&#xff09;取反加一&#…

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍&#xff0c;需要的朋友可以过来参考下 就如同int a&#xff1b;一样&#xff0c;int 也能被其它的修饰符修饰。除void类型外&#xff0c;基本数据类型之前都可以加各种类型修饰符&#xff0c;类型修饰符有如下四种: 1.signed---…

unsigned int 与 int 间的区别

unsigned int 是无符号整型&#xff0c;要求定义的整数一定是正整数。 当把一个负数赋值给无符号整型的变量的时候&#xff0c;会自动把最高位的符号位看成整数的一部分。 例如&#xff1a; unsigned int a -10; printf("%u", a); 结果为 因为-10的在计算机中存…

#C语言# unsigned类型的用法!

笔者今天在刷题时&#xff0c;有一个测试点老是通不过&#xff0c;经过多次检查代码和查看大佬题解之后&#xff0c;发现是一个小细节出了问题。 测试点的正确输出是一个大正数&#xff0c;笔者的测试输出是一个负数&#xff0c;差的离谱。 我一开始用的是int型的变量进行累加…

c语言--unsigned修饰符

在C语言中&#xff0c;unsigned是一种无符号整数修饰符。它可以与多个整数类型&#xff08;如int、short、long等&#xff09;结合使用&#xff0c;表示该整数类型只包含非负数值。unsigned修饰的整数类型不保存正负号位&#xff0c;因此可以用来表示更大的正整数范围。 例如&…

unsigned详讲(干货满满)

前言&#xff1a;过年偷懒了(●ˇ∀ˇ●)&#xff0c;但是年后开学了一定要恢复学习状态&#xff0c;在复习加继续学习的途中&#xff0c;我发现对于unsigned关键字的掌握并不是很熟练&#xff0c;于是翻阅了各个大佬的博客以及书籍&#xff0c;总结了对于unsigned的一些知识点…

python情感分析中文_【python机器学习】中文情感分析

3月31日,3月最后的一天接到了腾讯HR终面,看着招聘官网变成已完成还有点小自豪呢python 而后百度搜了搜显示“已完成”是否是稳了,原来不是,好多最后被通知没被录取。。。。web 随缘吧~代码还要继续码,博客还要继续更,论文还要继续写。。。。。正则表达式 数据源app 公众号…

yes or no?基于词典的情感分析法

自更博以来第一次断更&#xff0c;现在先把文本分析的坑补上&#xff0c;这篇文章着重介绍情感分析的两种基本方法之一&#xff1a;基于词典的情感分析&#xff08;下篇讲基于监督的情感分析&#xff09;&#xff0c;建模环境为R。 目录 1 背景与目的1.1 情感分析的应用场景1.…

snownlp情感分析

之前写过一篇博客&#xff0c;豆瓣短评分析&#xff0c;当时是拿分类问题来做的&#xff0c;预测的是用户给电影打的星级&#xff0c;其实也可以用snownlp对短评做情感分析。 情感分析就是用一些方法和技术来识别和提取原素材中的情感色彩&#xff0c;本篇博文主要就是介绍如何…

java 情感分析_Alink中文情感分析示例(Java版本)

Alink是基于Flink的机器学习算法平台,欢迎访问Alink的github获取下载链接及更多信息。alibaba/Alink​github.com 也欢迎加入钉钉群进行交流。 情感分析是对带有情感色彩(褒义贬义/正向负向)的主观性文本进行分析,以确定该文本的观点、喜好、情感倾向。本文将针对顾客对酒店的…

情感分析教程

作者|Zijing Zhu 编译|VK 来源|Towards Datas Science 据估计,世界上80%的数据是非结构化的。因此,从非结构化数据中提取信息是数据分析的重要组成部分。 文本挖掘是从非结构化文本数据中获取有价值的信息的过程,情感分析是文本挖掘的应用之一。它使用自然语言处理和机器学…

python 情感分析实例_基于Python的情感分析案例

**情感分析 **又称为倾向性分析和意见挖掘 它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程 其中情感分析还可以细分为情感极性 倾向 分析 情感程度分析 主客观分析等。 情感极性分析的目的是对文本进行褒义、贬义、中性的判 **情感分析&#xff1a;**又称为倾…

情感分析 综述

情感分析或观点挖掘是对人们对产品、服务、组织、个人、问题、事件、话题及其属性的观点、情感、情绪、评价和态度的计算研究。该领域的开始和快速发展与社交媒体的发展相一致&#xff0c;如评论、论坛、博客、微博、推特和社交网络&#xff0c;因为这是人类历史上第一次拥有如…

windows无法启动print spooler服务 资源不足,无法完成该操作

WIN10系统下print spooler打印服务无法启动&#xff0c;提示错误“错误0x800706b9资源不足&#xff0c;无法完成该操作”&#xff0c;可以快速的解决方法。 最近有Win10用户反馈无法打印机&#xff0c;而在启动print spooler服务&#xff08;打印服务&#xff09;时遇到错误提示…

【vSphere故障案例】案例十二:资源不足,vSphere HA故障切换级别

【vSphere故障案例】案例十二&#xff1a;资源不足&#xff0c;vSphere HA故障切换级别 2013-04-17 12:16:51标签&#xff1a;vSphere ESXi HA故障原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任…

解决32位程序报“内存资源不足,无法处理此命令”问题

1、先点击此链接下载插件包&#xff1a;​​​​​​​​​​​​​​​​​​​​​让32位程序能申请到4GB内存方法-C#文档类资源-CSDN文库 2、将EditBin放到程序的根目录 3、 程序的启动项的生成事件里面添加命令行 cd ..\EditBin\x64 editbin /largeaddressaware …

idea启动项目报错内存资源不足的问题

尝试一下几种方式&#xff1a; 1&#xff0c;改变idea的heap参数大小至1500 2&#xff0c;IDEA启动参数配置 -Xms128m -Xmx3072m -XX:ReservedCodeCacheSize240m -XX:UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB50 -ea -XX:CICompilerCount2 -Dsun.io.useCanonPrefixCac…

Vcenter 资源不足,无法满足XXX中集群 上的vSphere HA故障切换级别

故障现象: 做Vmotion时发现报错:Vcenter 资源不足,无法满足XXX中集群 上的vSphere HA故障切换级别 点开集群摘要发现,预留cpu和内存都是100%. 解决过程如下:

海康威视4200服务器显示资源不足,硬盘录像机提示“资源不足”是什么原因 -

很多人来问重庆监控&#xff0c;画面上会提示资源不足是怎么回事&#xff1f;重庆监控来给大家科普一下&#xff1a;资源不足不是设备的故障&#xff0c;他只是一种现象提示&#xff0c;画面上无图像&#xff0c;并且叠加了“资源不足”文字提示。有些伙伴可能重启了录像机几次…