C语言 unsigned与signed区别

[size=medium]我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的[/size]

[size=medium]Integer type(整数形式)是C语言中的基本数据形式之一,可以究竟对于Integer的定义是什么呢? 翻书看下,在介绍Integer的时候,还有一个关键词就是size(范围)[/size]

[quote="The C Programming Language"] an integer,typically reflecting [color=red]the natural size of integers on the host machine[/color][/quote]
[quote="Programming in ANSI C"] Integers are whole numbers with a range of values supported by a particular machine.[/quote]

[size=medium]所以说,Integer是一个范围内的所有整数,但是范围是就特定计算机而言的(depends on computer).

开始之前,先来了解下很基础的知识 - 计算机的存储单位和整数存储在计算机所占的内存大小。
1).计算机最小的存储单位是“位” 也就是bit或binary digits,用来存放一个二进制数,即 0或1。 8个二进制位为一个字节Byte。
2).对于 16-bit(16位)的计算机,int是以两个字节来储存的,而32-bit的计算机,则是以4个字节,即32个bit来储存的。

如果想要明白singed与unsigned的区别,除了这两个基本知识,还需要了解整数在计算机中的存储方式,以16-bit 计算机为例,定义 int a = 1; 那么a的存储方式用表格来表示
[/size]

[table]
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|
[/table]

[size=medium]首先需要提到的一点是,在C语言中十进制的整数都会转化为二进制存储在计算机。继续,上面所声明的 int a = 1,也就是 int signed a =1,C语言默认a是一个signed类型。 上面表格中最左端的为最高位,最右端的为最低位。signed类型的整数,只用了[color=red]去除最高位,剩下的15位来进行编码的,而最高位只是用来做标记(sign)[/color],标记整数的正负,0表示正,1表示负。所以对于signed的整数,的存储范围是(-2^15 to 2^15-1),也就是 -32768 到 +32767的整数。
而对于unsigned的整数,其16位全部用来编码,存储范围便是(0 to 2^16-1),即 0到 65535 的[color=red]非负整数[/color]。所以呢 你可以声明 int a = 1,或者 int a = -1, 但是不可以声明 unsigned a = -1 。但是需要提到的一点是,不管整数的类型是signed 还是 unsigned,都用了16位来存储,也就是说16位全部用来存储数据[/size]

[size=medium]上面所看到 a=1 的存储方式,就是将十进制的a在 程序员计算器 上转化为2字节的2进制,然后将这个结果放到上面的表格里。[color=red](原码存储)[/color]
可是对于 int a = -1 是怎样存储的?也就是说负数的存储方式是怎样的?
负数是以[color=red](补码存储)[/color],即是以原码的补码形式存储,看下面的表格[/size]

[color=blue]原码[/color][table]
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|
[/table]
[color=blue]反码[/color][table]
|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|0|
[/table]

[size=medium]反码就是将原码中的二进制1改为0,二进制0改为1。下面取得反码之后,在反码的基础上加上1.即[/size]
[color=blue]补码[/color][table]
|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|
[/table]

[size=medium]不知道,说到这里,大家会不会有个疑惑,上面所说的signed与unsigned的范围是有交集的,即都包含了0到+32767范围的整数,那么这个范围的整数在声明为signed与unsigned的时候,存储方式一样吗?答案是肯定的,在这个范围内的整数,signed与unsigned 的存储方式是一样的。

刚开始学C,我也不清楚弄明白这些编码方式,存储方式有什么意义,我现在个人觉得,只是在声明int的时候,如果不能保证它的正整数性,就不要声明为unsigned,当然可以保证的前提下声明为unsigned,确实扩大了范围。[/size]
资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
### C语言 `unsigned` 类型使用说明 #### 定义基本概念 在C语言中,`unsigned` 表示无符号类型的数据。这意味着该类型的变量仅能存储非负数值,即零或正数。相对应地,带有 `signed` 关键字的类型可以表示负数,默认情况下大多数整数类型被假定为带符号的[^1]。 #### 数据范围对比 对于相同长度的不同符号属性的整数类型来说,它们所能表达的最大值会有所不同。例如: - 对于一个8位的 `char` 类型而言, - 如果它是 `signed char`,则其取值区间是从−128到+127; - 若定义成 `unsigned char` 则变为从0至255[^3]。 #### 常见应用实例 当处理那些本质上不可能出现负数的情景时(比如数组索引),推荐采用 `unsigned` 整形以提高程序逻辑的一致性和可读性。此外,在某些特定场景下利用 `unsigned` 可以更高效地执行按位运算操作,因为不需要考虑符号扩展等问题。 #### 函数参数传递中的注意事项 函数声明时如果涉及到指针作为输入参数,则需要注意所指向的对象是否应该指定为 `unsigned` 类型。例如给定的一个设备控制接口可能接受命令码作为一个 `unsigned int` 参数以及额外数据通过另一个 `unsigned long` 形参传入[^2]: ```c int ioctl(struct inode*, struct file*, unsigned int cmd, unsigned long arg); ``` #### 打印输出格式化字符串的选择 为了正确显示 `unsigned` 类型的结果,在调用标准库函数如 `printf()` 进行格式化输出的时候要选用合适的转换规格符。具体来讲,针对不同宽度的无符号整形应当分别运用 `%u`, `%lu`, 或者其他相应形式[^4]: | 类型 | 转换字符 | | --- | --- | | `unsigned int` | `%u` | | `unsigned long` | `%lu` | 下面给出一段简单的代码片段用于展示如何打印一个 `unsigned int` 和 `unsigned long` 的值: ```c #include <stdio.h> void print_unsigned_values(void){ unsigned int ui = 42; unsigned long ul = 123456L; printf("Unsigned Int Value: %u\n", ui); // 正确的方式 printf("Unsigned Long Value: %lu\n", ul); // 正确的方式 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值