【C/C++】C/C++编程——整型(二)

简介: 【C/C++】C/C++编程——整型(二)

在 C++ 中,整型数据可以分为有符号数(Signed)和无符号数(Unsigned),这两种类型主要用于表示整数值,但它们在表示范围和用途方面有所不同。默认情况下,整数类型如 int、short、long 都是有符号数,通过在这些类型前加上 unsigned 关键字可以定义无符号数(例如:unsigned long)。字符型 char 可以是有符号的或无符号的,具体取决于编译器的默认设置。

有符号数 (Signed)

有符号整数可以表示正数、负数以及零。C++ 中的有符号整型包括:


short 或 signed short

int 或 signed int

long 或 signed long

long long 或 signed long long

有符号整型的表示范围是对称的,以 0 为中心,向正负两方向延伸。例如,如果一个有符号整型用 8 位(1 字节)表示,则其范围是从-128 到 127。这是因为其中一个位用于表示符号(通常是最高位),剩余的位表示大小。这一部分上一节中已经详细介绍了,有兴趣的朋友可以去看看。

无符号数 (Unsigned)

无符号整数仅用于表示非负数(包括零)。C++ 中的无符号整型包括:

unsigned short

unsigned int

unsigned long

unsigned long long

无符号整型的表示范围从 0 开始,向正方向延伸。继续上面的例子,如果一个无符号整型用 8 位表示,则其范围是从 0 到 255。所有的位都用于表示大小,没有位被用于表示符号。

表示范围

无符号数的表示范围是有符号数的两倍,但它不能表示负数。

3.png

有符号数与无符号数的区别

区别

有符号数是最高位为符号位,0 代表正数,1 代表负数。

#include <iostream> // 引入输入输出流库
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都要加std::

int main() // 主函数入口
{
    signed int a = -1089474374; // 定义一个有符号整型变量a,并赋值为-1089474374
    cout << std::hex << a << endl; // 将cout的输出格式设置为十六进制,并输出变量a的值,然后输出一个换行符
    
    si
    // b    f    0    f    f    0    b    a
    // 1011 1111 0000 1111 1111 0000 1011 1010

    return 0; // 返回0,正常结束程序
}

这段代码的作用是定义一个有符号整数 a,并将其初始化为 -1089474374。然后,使用 cout 以十六进制的形式输出这个整数的值,最后以换行符结束输出。


signed int a = -1089474374;:这里定义了一个 signed int(有符号整型)变量 a,并给它赋了一个负值 -1089474374。


cout << std::hex << a << endl;:


std::hex:这是一个 I/O 操作符,用来告诉 cout 后续的整数输出应该以十六进制的形式表示。

a:输出变量 a 的值,由于之前指定了十六进制格式,所以 a 的值将以十六进制形式显示。

endl:这是一个操作符,用来在输出流中插入一个换行符,并刷新输出缓冲区,使得输出立即出现在目标设备上(如屏幕)。

b f 0 f f 0 b a 是 a 的十六进制表示,对应的二进制形式是 1011 1111 0000 1111 1111 0000 1011 1010。十六进制的每一位对应二进制的四位,从左到右依次是:b(1011)、f(1111)、0(0000)、f(1111)、f(1111)、0(0000)、b(1011)、a(1010)。可以看到它的最高位为 1,表示它为负数。


无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。


十进制数 3236958022 的二进制表示方式为:1011 1111 0000 1111 1111 0000 1011 1010


如果将其当作无符号数来看待,那么它的原码为: 1100 0000 1111 0000 0000 1111 0100 0110,十六进制表示为:c 0 f 0 0 f 4 6

#include <iostream> // 引入标准输入输出流库,用于输入输出操作
using namespace std; // 使用标准命名空间std,避免每次调用标准库函数时都要加std::

int main() // 主函数入口,程序从这里开始执行
{
    unsigned int a = 3236958022; // 定义一个无符号整型变量a,并赋值为3236958022
    cout << std::hex << a << endl; // 将cout的输出格式设置为十六进制,并输出变量a的值,然后输出一个换行符

    return 0; // 主函数返回0,表示程序正常结束
}



unsigned int a = 3236958022;:这里定义了一个 unsigned int(无符号整型)变量 a,并将其初始化为 3236958022。


cout << std::hex << a << endl;:跟上个例子一样,这一行代码使用 cout 来输出变量 a 的值,但在输出之前,使用 std::hex 来指定输出格式为十六进制。endl 是用来在输出的末尾添加一个换行符,并且刷新输出缓冲区,确保输出立即显示。


std::hex:这个操作符改变了 cout 的状态,使得随后的整型输出以十六进制形式展示。

a:输出变量 a 的值。由于 cout 已经被设置为十六进制输出模式,所以 a 的值会以十六进制形式显示。

endl:在输出流中插入一个换行符,并刷新输出缓冲区,使得输出立即显示在目标设备上(例如屏幕)。

从输出结果可以看出,与在开头部分分析的一样,输出的十六进制为 c0f00f46,这表示无符号数最高位不是符号位,而就是数的一部分。


有符号数和无符号数的使用建议

当明确知道数值不会是负数时,建议使用无符号数。

当需要表示的数可能为负值,应使用有符号整数。

如果预期算术运算可能产生负数结果,使用有符号整数可以避免无符号数溢出的问题。

无符号数可以表示比相同大小的有符号数更大的正数值。


目录
相关文章
|
2月前
|
监控 Linux C++
4步实现C++插件化编程,轻松实现功能定制与扩展(2)
本文是《4步实现C++插件化编程》的延伸,重点介绍了新增的插件“热拔插”功能。通过`inotify`接口监控指定路径下的文件变动,结合`epoll`实现非阻塞监听,动态加载或卸载插件。核心设计包括`SprDirWatch`工具类封装`inotify`,以及`PluginManager`管理插件生命周期。验证部分展示了插件加载与卸载的日志及模块状态,确保功能稳定可靠。优化过程中解决了动态链接库句柄泄露问题,强调了采纳用户建议的重要性。
90 27
4步实现C++插件化编程,轻松实现功能定制与扩展(2)
|
3月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
3月前
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
7月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
881 85
|
3月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
3月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
7月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1000 30
|
6月前
|
消息中间件 存储 安全
|
7月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
138 11
|
7月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
127 0
C++入门6——模板(泛型编程、函数模板、类模板)