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

C语言中unsigned

signed(有符号)
表示变量可以存储正数、负数和零

使用最高位作为符号位(0表示正,1表示负)

默认情况下,int, char, short, long 都是有符号的

unsigned(无符号)
表示变量只能存储非负数(0和正数)

所有位都用于表示数值大小

需要显式声明

二、数据范围和表示
类型 大小 有符号范围 无符号范围
char 1字节 -128 ~ 127 0 ~ 255
short 2字节 -32768 ~ 32767 0 ~ 65535
int 4字节 -2147483648 ~ 2147483647 0 ~ 4294967295
long 4/8字节 依系统而定 依系统而定

 

C语言允许我们这样做,如果不希望设置符号位,可以在数据类型前面加上 unsigned 关键字,例如:

unsigned short a = 12;
unsigned int b = 1002;
unsigned long c = 100002;
unsigned long long d = 10000002;
这样,short、int、long 和 long long 中就没有符号位了,所有的位都用来表示数值,正数的取值范围更大了。这也意味着,使用了 unsigned 后只能表示正数,不能再表示负数了。

如果将一个数字分为符号和数值两部分,那么不加 unsigned 的数字称为有符号数,能表示正数和负数,加了 unsigned 的数字称为无符号数,只能表示正数。

请读者注意一个小细节,如果是unsigned int类型,那么可以省略 int ,只写 unsigned,例如:

unsigned n = 100;
它等价于:

unsigned int n = 100;
无符号数的输出
无符号数可以以八进制、十进制和十六进制的形式输出,它们对应的格式控制符分别为:

unsigned short unsigned int unsigned long unsigned long long
八进制 %ho %o %lo %llo
十进制 %hu %u %lu %llu
十六进制 %hx 或者 %hX %x 或者 %X %lx 或者 %lX %llx 或者 %llX
上节我们也讲到了不同进制形式的输出,但是上节我们还没有讲到正负数,所以也没有关心这一点,只是“笼统”地介绍了一遍。现在本节已经讲到了正负数,那我们就再深入地说一下。

严格来说,格式控制符和整数的符号是紧密相关的,具体就是:

%d 以十进制形式输出有符号数;
%u 以十进制形式输出无符号数;
%o 以八进制形式输出无符号数;
%x 以十六进制形式输出无符号数。
那么,如何以八进制和十六进制形式输出有符号数呢?很遗憾,printf() 并不支持,也没有对应的格式控制符。在实际开发中,也基本没有“输出负的八进制数或者十六进制数”这样的需求,我想可能正是因为这一点,printf() 才没有提供对应的格式控制符。

下表全面地总结了不同类型的整数,以不同进制的形式输出时对应的格式控制符(--表示没有对应的格式控制符)。

short int long unsigned short unsigned int unsigned long unsigned long long
八进制 -- -- -- %ho %o %lo %llo
十进制 %hd %d %ld %hu %u %lu %llu
十六进制 -- -- -- %hx 或者 %hX %x 或者 %X %lx 或者 %lX %llx 或者 %llX
有读者可能会问,上节我们也使用 %o 和 %x 来输出有符号数了,为什么没有发生错误呢?这是因为:

当以有符号数的形式输出时,printf() 会读取数字所占用的内存,并把最高位作为符号位,把剩下的内存作为数值位;
当以无符号数的形式输出时,printf() 也会读取数字所占用的内存,并把所有的内存都作为数值位对待。
对于一个有符号的正数,它的符号位是 0,当按照无符号数的形式读取时,符号位就变成了数值位,但是该位恰好是 0 而不是 1,所以对数值不会产生影响,这就好比在一个数字前面加 0,有多少个 0 都不会影响数字的值。

如果对一个有符号的负数使用 %o 或者 %x 输出,那么结果就会大相径庭,读者可以亲试。

可以说,“有符号正数的最高位是 0”这个巧合才使得 %o 和 %x 输出有符号数时不会出错。

再次强调,不管是以 %o、%u、%x 输出有符号数,还是以 %d 输出无符号数,编译器都不会报错,只是对内存的解释不同了。%o、%d、%u、%x 这些格式控制符不会关心数字在定义时到底是有符号的还是无符号的:

你让我输出无符号数,那我在读取内存时就不区分符号位和数值位了,我会把所有的内存都看做数值位;
你让我输出有符号数,那我在读取内存时会把最高位作为符号位,把剩下的内存作为数值位。
说得再直接一些,我管你在定义时是有符号数还是无符号数呢,我只关心内存,有符号数也可以按照无符号数输出,无符号数也可以按照有符号数输出,至于输出结果对不对,那我就不管了,你自己承担风险。

下面的代码进行了全面的演示:

#include <stdio.h>
int main()
{
short a = 0100; //八进制
int b = -0x1; //十六进制
long c = 720; //十进制

unsigned short m = 0xffff; //十六进制
unsigned int n = 0x80000000; //十六进制
unsigned long p = 100; //十进制

//以无符号的形式输出有符号数
printf("a=%#ho, b=%#x, c=%ld\n", a, b, c);
//以有符号数的形式输出无符号类型(只能以十进制形式输出)
printf("m=%hd, n=%d, p=%ld\n", m, n, p);

return 0;
}

运行结果:
a=0100, b=0xffffffff, c=720
m=-1, n=-2147483648, p=100

对于绝大多数初学者来说,b、m、n 的输出结果看起来非常奇怪,甚至不能理解。按照一般的推理,b、m、n 这三个整数在内存中的存储形式分别是:

当以 %x 输出 b 时,结果应该是 0x80000001;当以 %hd、%d 输出 m、n 时,结果应该分别是 -7fff、-0。但是实际的输出结果和我们推理的结果却大相径庭,这是为什么呢?

注意,-7fff 是十六进制形式。%d 本来应该输出十进制,这里只是为了看起来方便,才改为十六进制。
其实这跟整数在内存中的存储形式以及读取方式有关。b 是一个有符号的负数,它在内存中并不是像上图演示的那样存储,而是要经过一定的转换才能写入内存;m、n 的内存虽然没有错误,但是当以 %d 输出时,并不是原样输出,而是有一个逆向的转换过程(和存储时的转换过程恰好相反)。
 

 

 

参考:https://blog.csdn.net/weixin_44788542/article/details/136679006

 

http://www.zskr.cn/news/26538.html

相关文章:

  • 解码Linux文件IO之触摸屏原理及应用
  • 2025年精密球轴承厂家权威推荐榜:半导体设备/加工中心/机床主轴/直联主轴/电主轴/定制/国产高端/不锈钢/陶瓷/耐腐蚀/超高真空/真空泵/晶圆搬运机械手臂/进口替代/国产半导体/低温泵轴承精选
  • 腾讯TCCL和阿里ACCL对比
  • BOS中多选基础资料字段设置默认值
  • DeepSeek-MOE原理讲解
  • npm---查看镜像和更换镜像
  • 在一台机器上搭建一体化 Ceph 存储集群
  • Windows下利用 Python OCR 识别电子发票(增值税专用发票)(使用 GhostScript 和 Tesseract )
  • 2025年臭氧检测仪厂家权威推荐榜:在线式/固定式/便携式/手持式/工业臭氧检测仪专业选购指南
  • ✨WPF编程基础【2.2】:布局面板实战 - 详解
  • 2025年不锈钢酸洗钝化液厂家推荐排行榜:环保型不锈钢清洗钝化液,不锈钢管酸洗钝化处理,不锈钢清洗剂专业选购指南
  • 达梦8加密函数是什么怎么调用,达梦数据库加密算法
  • Pandas -
  • MyBatis 的 @SelectProvider 是一个强大的注解,用于动态生成 SQL 语句
  • 物联网短信收发速成:10分钟用SMS库上手实战
  • npx和npm exec有什么区别
  • 2025年耳机插座厂家权威推荐榜:DC防水耳机插座,专业防水防尘设计,耐用稳定性能卓越之选
  • 混合动力电动汽车(HEV)Matlab 建模仿真
  • 2025年移动泵车厂家推荐排行榜,防汛泵车,水泵机组,应急排水泵车,柴油机泵车公司精选
  • 阅读笔记二:高效编程的核心策略
  • OpenAI 发布 GPT-5 Instant:AI 有了 “情感温度计“ - 实践
  • 分布式 Multi Agent 安全高可用探索与实践
  • ESP32 + MCP over MQTT:借助大模型控制智能硬件设备
  • VMware安装虚拟机并且部署 CentOS 7 指南 - 指南
  • 线性代数 SVD | 几何本质、求解方法与应用 - 教程
  • VUE中表达校验-明明有值却还是出现非空提示
  • Oracle统计信息相关
  • Consul 与 Prometheus 集成实战:服务自动发现与监控配置指南(含 ThinkPHP8 示例)
  • 完整教程:笔记本键盘失灵别慌!3种方法快速禁用(附恢复技巧)
  • 2025年工业设备安装厂家权威推荐榜:管道/电气/暖通空调/空压系统/纯水系统/厂房通风/车间配电/机械设备安装服务深度解析