突破编程_C++_面试(基本数据类型)

面试题1:在32位和64位系统上,intshortlonglong longchar 类型通常分别占用多少字节

在 32 位和 64 位系统上,intshortlonglong longchar 类型的大小可能会有所不同,这取决于编译器和操作系统。但按照常见的约定,一般的占用字节为:
32 位系统(通常是基于 x86 或 x86_64 的,尽管后者也是 64 位系统,但很多实现为了兼容性仍然保留 32 位模式):
char :通常占用 1 字节。
short :通常占用 2 字节。
int :通常占用 4 字节。
long :通常占用 4 字节。
long long :通常占用 8 字节。
64 位系统(基于 x86_64 或 ARM64 等架构):
char :通常占用1字节。
short :通常占用2字节。
int :根据编译器和操作系统的不同,可能是 4 字节或 8 字节。在 Windows 上, int 通常是 4 字节,而在 Linux 和 macOS 上,int 通常是 8 字节。
long :根据编译器和操作系统的不同,可能是 4 字节或 8 字节。在 Windows 上, long 通常是 4 字节,而在 Linux 和 macOS 上,long 通常是 8 字节。
long long :通常占用8字节。
注意:这些大小并不是由 C++ 标准直接规定的,而是由编译器和操作系统决定的。因此,不同的编译器或操作系统可能会有所不同。另外,现代编译器通常提供了类型大小的查询功能,例如通过 sizeof 运算符。
如下为样例代码:

#include <iostream>  int main() 
{std::cout << "Size of char: " << sizeof(char) << " bytes" << std::endl;std::cout << "Size of short: " << sizeof(short) << " bytes" << std::endl;std::cout << "Size of int: " << sizeof(int) << " bytes" << std::endl;std::cout << "Size of long: " << sizeof(long) << " bytes" << std::endl;std::cout << "Size of long long: " << sizeof(long long) << " bytes" << std::endl;return 0;
}

上面代码在 Windows 上使用 64 位平台编译后运行的结果为:

Size of char: 1 bytes
Size of short: 2 bytes
Size of int: 4 bytes
Size of long: 4 bytes
Size of long long: 8 bytes

面试题2:sizeof(void*) 在32位和64位系统上的值是多少?为什么?

sizeof(void*) 在 C++ 中表示指针的大小。在 32 位系统上,sizeof(void*) 的值通常是 4 字节,而在 64 位系统上,其值通常是 8 字节。
这是因为指针本质上是一个存储内存地址的变量。在 32 位系统中,内存地址的大小是 32 位,即 4 字节,因为 2^32(约 4GB)是 32 位系统可以寻址的最大内存量。相应地,指针的大小需要足够大以存储这个 32 位的内存地址。
在 64 位系统中,内存地址的大小是 64 位,即 8 字节,因为 2^64(约 16EB)是 64 位系统可以寻址的最大内存量。因此,64 位系统中的指针也需要 8 字节来存储内存地址。
所以,sizeof(void*) 在 32 位系统上的值是 4,在 64 位系统上的值是 8。这是因为指针需要足够大以存储对应系统架构下的内存地址。这个大小是由系统的硬件架构决定的,而不是由 C++ 语言本身决定的。

面试题3:如何获取各种基本数据类型的取值范围

头文件 climits (在 C 语言中为 limits.h )中包含了关于整型范围的宏定义。具体如下表所示:

符号常量含义
CHAR_BITchar 的位数
CHAR_MAXchar 的最大值
CHAR_MINchar 的最小值
SCHAR_MAXsigned char 的最大值
SCHAR_MINsigned char 的最小值
UCHAR_MAXunsigned char 的最大值
SHRT_MAXshort 的最大值
SHRT_MINshort 的最小值
USHRT_MAXunsigned short 的最大值
INT_MAXint 的最大值
INT_MINint 的最小值
UINT_MAXunsigned int 的最大值
LONG_MAXlong 的最大值
LONG_MINlong 的最小值
ULONG_MAXunsigned long 的最大值
LLONG_MAXlong long 的最大值
LLONG_MINlong long 的最小值
ULLONG_MAXunsigned long long 的最大值

头文件 cfloat 中包含了关于浮点型范围的宏定义。具体如下表所示:

符号常量含义
FLT_MAXfloat 的最大值
FLT_MINfloat 的正最小值
DBL_MAXdouble 的最大值
DBL_MINdouble 的正最小值
LDBL_MAXlong double 的最大值
LDBL_MINlong double 的正最小值

面试题4:什么是隐式类型转换?什么是显式类型转换?

隐式类型转换和显式类型转换是 C++ 中两种不同类型的类型转换。
隐式类型转换
隐式类型转换是编译器自动进行的类型转换,不需要用户显式地指定转换操作。当需要将一种数据类型转换为另一种数据类型时,如果存在隐式转换规则,编译器会自动进行转换。这种转换通常发生在类型兼容的情况下,例如将一个较小范围的整数类型赋值给一个较大范围的整数类型,或者将一个派生类对象赋值给一个基类对象。例如,将一个整数赋值给一个浮点数变量,或者将一个派生类的对象赋值给一个基类对象。这种转换对用户来说通常是透明的,不需要用户干预。
显式类型转换
显式类型转换需要在代码中明确指定需要进行的类型转换操作。通过显式转换,可以将一种数据类型强制转换为另一种数据类型,即使这两种类型之间没有隐式转换规则。显式转换需要用户明确的指定要转换的类型,而且在转换的过程中可能会造成数据丢失或截断。例如,将一个浮点数转换为整数,或者将一个非基类的对象转换为基类对象。显式转换通常需要使用类型转换运算符(如 static_cast 、 dynamic_cast 、 reinterpret_cast 、 const_cast )或者类型转换函数来实现。
总的来说,隐式类型转换是编译器自动进行的,而显式类型转换需要用户明确指定转换的类型。在编程时,应根据具体情况选择合适的类型转换方式,以确保程序的正确性和安全性。

面试题5:static_castdynamic_castreinterpret_castconst_cast 之间的区别是什么?

static_cast 、 dynamic_cast 、 reinterpret_cast 和 const_cast 是 C++ 中的四种类型转换运算符,它们各有不同的用途和限制。
static_cast
这种类型是最常用的类型转换。它主要用于非多态类型之间的转换,如基本数据类型之间的转换、空指针和空指针之间的转换、非多态类类型之间的转换(如类和结构之间的转换)等。static_cast在编译时进行类型检查,但不会进行运行时检查,因此转换的安全性相对较低。如果转换类型不兼容,编译器会报错。
dynamic_cast
这种类型转换主要用于多态类型之间的转换。它通常用于类和子类之间的转换,特别是当子类对象被当作基类对象使用时。 dynamic_cast 在运行时进行类型检查,因此比 static_cast 更安全。如果转换失败(例如,试图将基类对象转换为派生类对象,而该对象实际上不是派生类对象), dynamic_cast 会返回空指针。需要注意的是, dynamic_cast 要求转换类型必须是指针或引用,并且转换的类必须有虚函数。
reinterpret_cast
这种类型转换是最危险的,因为它允许在任意类型之间进行转换,而不需要任何类型兼容性检查。 reinterpret_cast 通常用于位字段和硬件地址等低级操作。由于它不进行任何类型检查,因此使用时要格外小心,以避免出现未定义行为。
const_cast
这种类型转换用于修改类型的 const 或 volatile 属性。 const_cast 允许程序员在 const 和非 const 对象之间进行转换,或者在 volatile 和非 volatile 对象之间进行转换。然而,尽管 const_cast 可以移除 const 属性,但它并不能改变对象的实际值,因此不能用于修改 const 对象的值。
总的来说,这四种类型转换运算符各有其特点和适用场景。在选择使用哪种转换时,应根据具体的需求和场景来决定。一般来说,应优先使用 static_cast 和 dynamic_cast ,因为它们提供了类型检查,可以提高代码的安全性。而 reinterpret_cast 和 const_cast 应谨慎使用,因为它们可能导致未定义行为或违反类型安全。

面试题6:枚举类型能否与整数类型进行比较和转换?

在C++中,枚举类型可以与整数类型进行比较和转换,尽管这种做法可能不是最佳实践,因为它可能会破坏枚举类型的类型安全性。
比较
枚举值可以直接与整数进行比较,因为枚举值在内部实际上是整数。例如:

enum Color { RED = 1, GREEN = 2, BLUE = 3 };Color myColor = GREEN;if (myColor == 2) 
{// 这个条件将为真,因为 GREEN 的值为 2
}

然而,直接比较枚举值和整数可能会使代码难以理解和维护。更好的做法是使用枚举值进行比较:

if (myColor == GREEN)
{// 更清晰的方式来表达条件
}

转换
枚举到整数
枚举值可以隐式地转换为整数,因为它们在内部就是整数表示。例如:

int colorValue = GREEN; // 隐式转换,colorValue 现在是 2

也可以进行显式转换,以更清楚地表达转换意图:

int colorValue = static_cast<int>(GREEN); // 显式转换

整数到枚举
同样地,整数也可以转换为枚举类型,但这种转换应该小心进行,以避免产生无效的枚举值。例如:

Color myColor = static_cast<Color>(2); // myColor 现在是 GREEN

但是,如果转换的整数不在枚举定义的有效范围内,结果将是一个有效的枚举类型,但可能不代表任何有意义的值:

Color myColor = static_cast<Color>(99); // myColor 现在是一个无效的枚举值

尽管 C++ 允许枚举和整数之间的比较和转换,但最佳实践是尽量避免这样做,以保持代码的清晰性和类型安全。如果确实需要进行比较或转换,最好使用显式转换,并在可能的情况下限制在有效范围内。此外,对于枚举值的比较,最好使用枚举常量而不是直接的整数值。

面试题7:bool 类型在C++中是如何实现的?

在 C++ 中, bool 类型是一个基本数据类型,用于表示逻辑值 true 或 false 。然而, bool 类型在底层是如何实现的,实际上取决于编译器和操作系统。 C++ 标准并没有规定 bool 的具体大小和内存布局,只规定了它的行为。
在大多数现代编译器和系统中, bool 类型通常被实现为一个足够小的整数类型,通常是 char 类型的大小(即 1 字节)。这是因为将 bool 实现为整数类型可以方便地将其转换为其他整数类型,并且可以利用整数的位操作来操作布尔值。

面试题8:如何在不用到临时变量的情况下交换两个变量的值?

可以使用位异或操作来交换两个变量的值,如下为样例代码:

#include <iostream>  int main() 
{int a = 1;int b = 2;// 原始值  std::cout << "before swap: a = " << a << ", b = " << b << std::endl;// 使用位异或操作交换值  a = a ^ b;b = a ^ b;a = a ^ b;// 交换后的值  std::cout << "after swap: a = " << a << ", b = " << b << std::endl;return 0;
}

上面代码的输出为:

before swap: a = 1, b = 2
after swap: a = 2, b = 1

上面代码使用了三次异或操作来交换 a 和 b 的值。异或操作有一个特性:同一个数与它自身异或的结果是 0 ,与 0 异或的结果还是它自身。因此,通过三次异或运算,可以实现两个变量的值的交换。
以下是交换过程的解释:
第一次异或:a = a ^ b 。此时, a 存储了 a 和 b 的异或结果,而 b 的值保持不变。
第二次异或:b = a ^ b 。由于此时的 a 是 a 和 b 的异或结果, b 是原始的 b 值,所以 b 现在存储了 a 的原始值。
第三次异或:a = a ^ b 。由于此时的 a 是 a 和 b 的异或结果, b 是 a 的原始值,所以 a 现在存储了 b 的原始值。
通过这种方式,可以使用位操作交换了 a 和 b 的值。这种方法在不需要临时变量的情况下交换两个变量的值是非常有用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程学习小结

线程&#xff1a;一个程序内部的一条执行流程 多线程&#xff1a;软硬件实行的多条执行流程的技术&#xff08;多线程由cpu负责调度执行&#xff09; 多线程的本质就是多个程序同时执行&#xff0c;但是进程同一时间只能有一个&#xff0c;所以线程会被cpu调度并且分配时间片…

使用redis-insight连接到服务器上的redis数据库

一、安装redis&#xff1a; 安装 Redis。你可以通过运行下面的命令来使用 yum 安装 Redis&#xff1a; sudo yum install redis 启动 Redis 服务。安装完成后&#xff0c;你可以通过运行下面的命令来启动 Redis 服务&#xff1a; sudo systemctl start redis 设置 Redis 服务…

g++编译--运行opencv步骤。

一&#xff1a;下载opencv源码库。 1 cmake -D CMAKE_BUILD_TYPERelease -D OPENCV_GENERATE_PKGCONFIGON -D WITH_FFMPEGON … 2 make -j 8 3 make install 二&#xff1a; 找到两个目录&#xff1a; include/ 所有头文件 lib/ 所哟库文件 三&#xff1a;编译运行代码&#xf…

定时器(基本定时器、通用定时器、高级定时器)

目录 一、基本定时器 二、通用定时器 三、高级定时器 一、基本定时器 1、作用&#xff1a;计时和计数。 二、通用定时器 1、除了有基本定时器的计时和计数功能外&#xff0c;主要有输入捕获和输出比较的功能&#xff0c;硬件主要由六大部分组成&#xff1a; ① 时钟源 ② 控…

前端架构: 脚手架框架之yargs的11种基础核心特性的应用教程

脚手架框架之yargs的基础核心特性与应用 1 &#xff09;概述 yargs 是脚手架当中使用量非常大的一个框架进入它的npm官网: https://www.npmjs.com/package/yargs 目前版本: 17.7.2Weekly Downloads: 71,574,188 (动态数据)最近更新&#xff1a;last month (github)说明这是一个…

【Webpack】处理图片资源

处理图片资源 过去在 Webpack4 时&#xff0c;我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了&#xff0c;我们只需要简单配置即可处理图片资源 1. 配置 const path require("path");modul…

美国突然致敬中本聪

作者&#xff1a;秦晋 有点看不懂美国的神操作。 2月16日&#xff0c;据《Bitcoin Magazine》报道&#xff0c;比特币的竞争对手、美国参议员伊丽莎白-沃伦对比特币的立场突然180度大转弯。由反对立场转为支持立场。让很多行业媒体出乎意料&#xff0c;甚至惊掉下巴。 报道称&a…

Web Components详解-HTML Templates

前言 在前面Web Components系列文章的插槽中&#xff0c;我们使用直接在body中写入html标签的形式来承载shadowDOM中的元素&#xff0c;这么做会使标签在DOM多渲染一次&#xff0c;不仅降低了性能&#xff0c;还使标签直接暴露在页面中&#xff0c;遵循组件的可重用性、隔离性…

Unity3D 九宫格地图加载逻辑详解

前言 Unity3D是一款强大的游戏开发引擎&#xff0c;拥有丰富的功能和工具&#xff0c;可以帮助开发者快速构建出各种类型的游戏。在游戏开发中&#xff0c;地图加载是一个非常重要的环节&#xff0c;九宫格地图加载是一种常用的地图加载方式&#xff0c;可以有效地提高游戏性能…

文件上传漏洞--Upload-labs--Pass01--前端绕过

一、前端绕过原理 通俗解释&#xff0c;我们将写有恶意代码的php后缀文件上传到网页&#xff0c;网页中的javascript代码会先对文件的后缀名进行检测&#xff0c;若检测到上传文件的后缀名为非法&#xff0c;则会进行alert警告。若想上传php后缀的文件&#xff0c;就要想办法对…

人工智能学习专栏文章汇总

人工智能大潮已来&#xff0c;stay hungry, stay foolish! 人工智能技术学习类文章汇总&#xff1a; 人工智能学习与实训笔记&#xff08;一&#xff09;&#xff1a;零基础理解神经网络-CSDN博客 人工智能学习与实训笔记&#xff08;二&#xff09;&#xff1a;神经网络之图…

Html的<figure><figcaption>标签

Html的<figure><figcaption>标签 示例一: <figure><figcaption>figcaption001, fig标题1 </figcaption><figcaption>figcaption002, fig标题2 </figcaption><div style"width:calc(100px*2); height:calc(100px*2); back…

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…

解锁Spring Boot中的设计模式—03.委派模式:探索【委派模式】的奥秘与应用实践!

委派模式 文章目录 委派模式1.简述**应用场景****优缺点****业务场景示例** 2.类图3.具体实现3.1.自定义注解3.2.定义抽象委派接口3.3.定义具体执行者3.4.定义委派者(统一管理委派任务)3.5.定义委派者管理类 4.测试4.1.controller层4.2.测试不同场景4.2.1.测试生产部门计算费用…

html5移动端适配;检测浏览器信息函数

html5移动端适配 //动态改变font-size大小 (function changeFontSize() {let resizeEvt orientationchange in window ? orientationchange : resizeif (!isPC()) {let docEl document.documentElement;// recalc function () {let clientWidth docEl.clientWidth;docEl.…

【GPT-2】论文解读:Language Models are Unsupervised Multitask Learners

文章目录 介绍zero-shot learning 零样本学习 方法数据Input Representation 结果 论文&#xff1a;Language Models are Unsupervised Multitask Learners 作者&#xff1a;Alec Radford, Jeff Wu, Rewon Child, D. Luan, Dario Amodei, I. Sutskever 时间&#xff1a;2019 介…

java.lang.NumberFormatException: For input string: “!“

文章目录 MyBatis XML文件查询报错&#xff1a;For input string: "!"原因调整办法OGNL表达式 MyBatis XML文件查询报错&#xff1a;For input string: “!” <if test"memberInfoDrawing.phone ! null and memberInfoDrawing.phone ! and memberInfoDrawi…

Hadoop-Yarn-NodeManager都做了什么

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在我的<Hadoop-Yarn-启动篇>博客中已经简要的分析了NodeManager的启动过程&#xff0c;NodeManager是管理整个集…

MongoDB聚合运算符:$add

$add运算符将将数字相加或将数字和日期相加。如果参数之一是日期&#xff0c;则 $add会将其他参数视为毫秒&#xff0c;并添加到日期中。 语法 { $add: [ <expression1>, <expression2>, ... ] }参数可以是任何有效的表达式&#xff0c;只要能否解析为数值或日期…

C++中.h与.hpp文件的差异问答

.h文件与.hpp文件在C编程中的区别主要基于约定和偏好&#xff0c;而不是C语言或其编译器强制执行的任何技术差异。以下是这些差异的概述&#xff1a; 约定&#xff1a; .h 文件&#xff1a;此扩展名源于C编程&#xff0c;表示头文件。它在C中常用于头文件&#xff0c;但不一定表…