当前位置: 首页 > 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.jsqmd.com/news/18662/

相关文章:

  • 解码Linux文件IO之触摸屏原理及应用
  • 2025年最新游戏机和游艺机的屏幕驱动方案(含音乐播放和功放芯片)
  • 2025 年最新推荐!国内加工厂家排行榜:含车铣复合 / 精密零件 / CNC 车床等领域优质企业
  • 2025年精密球轴承厂家权威推荐榜:半导体设备/加工中心/机床主轴/直联主轴/电主轴/定制/国产高端/不锈钢/陶瓷/耐腐蚀/超高真空/真空泵/晶圆搬运机械手臂/进口替代/国产半导体/低温泵轴承精选
  • 【安徽财经大学主办】第七届管理科学信息化与经济创新发展国际学术会议 (MSIEID 2025)
  • 2025 盐城美术培训机构最新推荐榜单:涵盖全龄段课程 + 4A 信用单位,优质机构助你精准选课
  • 2025年冷水机组厂家权威推荐榜:水冷螺杆/风冷螺杆/水冷式/风冷式/螺杆式冷水机专业选购指南
  • 再看 AI 网关:助力 AI 应用创新的关键基础设施
  • 2025 年独立游戏公司开发 AI 美术平台最新推荐榜单:覆盖全流程创作需求,助力团队突破美术瓶颈
  • 先收藏系列 工业相机的六问六答!
  • 凌晨 2 点的朋友圈,她靠微擎实现了 “带娃赚钱两不误”
  • 2025年信息流代运营服务商权威推荐榜:专业投放策略与高转化效果深度解析,助力品牌精准营销
  • 用AI帮忙,开发刷题小程序:微信小程序在线答题框架架构解析
  • 2025 国内西服定制品牌精选榜:婚礼/高级/高端/高档/男士/女士/轻奢西装定制厂家,从智能智造到匠心传承的多元之选
  • 2025年工厂维保服务厂家权威推荐榜:机电维修、应急维修、设备安装维修、运维服务全方位解决方案精选
  • 腾讯TCCL和阿里ACCL对比
  • BOS中多选基础资料字段设置默认值
  • 垃圾回收器总览
  • 软件工程第三次作业——结对项目
  • DeepSeek-MOE原理讲解
  • npm---查看镜像和更换镜像
  • 博弈树
  • 在一台机器上搭建一体化 Ceph 存储集群
  • 2025年硅锰合金厂家推荐排行榜,硅锰合金颗粒,硅锰合金粉,高纯度硅锰合金材料源头厂家深度解析
  • byte,short,int,Long,char数据类型复习
  • PyCharm下载安装教程及激活步骤(附安装包)超详细保姆级教程
  • 2025 年活性炭源头厂家最新推荐榜,技术实力与市场口碑深度解析,筛选优质可靠品牌颗粒/柱状/粉末/煤质/木质活性炭
  • 2025年手持光谱仪厂家推荐排行榜,光谱分析仪,便携式光谱仪,矿石元素分析仪,合金金属不锈钢铝合金,贵金属三元催化检测设备公司精选
  • Windows下利用 Python OCR 识别电子发票(增值税专用发票)(使用 GhostScript 和 Tesseract )
  • 2025年臭氧检测仪厂家权威推荐榜:在线式/固定式/便携式/手持式/工业臭氧检测仪专业选购指南