16位,short变量的取值范围是-32768~+32767,而unsigned的取值范围是0~65535) 当是有符号时,其最大值为+32767,再+1之后就会溢出为-32768;当为无符号整数时就无影响...,继续+1为32768. 3.整型字面值 整型字面值(常量)是显式的书写的常量 和C相同,C++能够以三种不同的计数方式来书写整数,基数为10,基数为8(老式UNIX版本),基数为16(硬件黑客的最爱)...他们的区别主要有: 例如#define NUM=255定义的常量是没有类型的,所以给出的是一个立即数,编译器在编译的时候进行替换,只要有常量的地方就进行拷贝替换 const int MAX=255;定义常量有类型的名字...define – 在预处理阶段进行替换 const – 在编译时确定其值 2).类型检查 define – 无类型,不进行类型安全检查,可能会产生意想不到的错误 const – 有数据类型,编译时会进行类型检查...4).其他 在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
其实本质上null和NULL都是符号,只是在不同的编译器上NULL被宏定义指定内容,null没有定义而已。 例如在vs环境中,NULL被指定为0,代码如下。 ?...NULL 和 nullptr 根据上面,我们知道了NULL本身是符号,只是不同编译器给出了不同的定义。刚刚看到了vs的定义,下面看下gcc对NULL的定义: ?...1) 如果gcc是c 语言模式而且gcc版本低于3.0,那么定义NULL 为 void* 类型 2) 如果gcc是c++ 语言模式,而且是32位,那么定义NULL 为无类型的0 3) 如果gcc是c++...为了解决这种二义性,nullptr应运而生,C++是强类型语言,又有模板、重载之类需要编译器“依类型随机应变”的东西,所以作为指针 型的0和整数类型的0就必须分开,不然会带来很多麻烦。...0的相关 ‘\0’是一个“空字符”常量,它表示一个字符串的结束,它的ASCII码值为0,与’0‘的ASCII码值48是不一样的。
但是实际使用是只能选有符号或者无符号的。根据编译器不同,char的表现不同。...1 把浮点数转化为整型时,仅保留小数点前面的部分 把整型转化为浮点数时,小数部分为0;如果整数的大小超过浮点数表示的范围,可能会损失精度 当给无符号类型的整数赋值一个超过它表示范围的数时,会发生溢出。...实际值是赋值的数对最大表示数取余数的结果 当给有符号的类型一个超出它表示范围的值时,具体结果会根据编译器的不同而不同 有符号数与无符号数混用时,结果会自动转化为无符号数 (使用小转大的原则,尽量不丢失精度...不同的编译器有不同的处理方式,得到的结果可能不经相同,在编写代码时需要避免此类情况的出现 尽管我们知道不给一个无符号数赋一个负数,但是经常会在不经意间犯下这样的错误,例如当一个算术表达式中既有无符号数,...指针本身应该是一个无符号的整数,指针大小与程序中地址所占内存空间一致,32位程序中指针是4字节,64位程序,指针大小为8字节 使用指针时的限制比引用要宽泛的多 指针可以指向对象,也可以指向另一个指针 指针不需要初始化
int64_t 不要使用uint32_t等无符号类型,你应该使用断言来指出变量为非负数,混用有符号类型和无符号类型可能导致非预期的结果(见下文) 执行浮点数运算时使用double,因为float通常精度不够且双精度浮点数和单精度浮点数的计算代码相差无几...,结果是初始值对无符号类型表示数值总数取模后的余数。...当一个算数表达式中既有无符号类型又有带符号类型时,带符号数会自动转化为无符号数,结果可能是出乎意料的: // 切勿混用带符号类型和无符号类型 unsigned u = 10; int i = -42;...使用未经初始化的指针是引发运行时错误的一大原因,如果使用了未经初始化的指针,那么指针所占空间的当前内容将被当成一个地址值,当这个地址值指向的内存空间中正好有内容时,就可能引发难以预料的后果。...,关于类的知识我们主要在后面的面向对象编程中讲解,这里简单给出一个例子: // C++11支持为数据成员提供一个类内初始值, 没有初始值的成员将被默认初始化 struct bar { std::
位数取决于编译器和平台) 布尔 Boolean bool boolean bool 二、有符号和无符号整数 在 C++ 中,我们可以选择使用有符号或无符号的整数类型,例如 unsigned int 是无符号的...四、精度丢失问题 有符号和无符号整数本身不会导致精度丢失,但在进行某些操作时可能会出现精度丢失的情况。这主要发生在以下几种情况: 溢出:整数类型有一个固定的范围,如果一个数超过这个范围,就会发生溢出。...例如,一个无符号8位整数的最大值是255,如果试图将其增加到256,它将溢出并变为0。同样,一个有符号8位整数的最大值是127,如果试图将其增加到128,它将溢出并变为-128。...这种情况下,会丢失预期的值。 类型转换:在进行类型转换时,如果源类型的范围大于目标类型的范围,可能会丢失精度。...同样,如果将一个有符号整数转换为无符号整数,或者将一个无符号整数转换为有符号整数,也可能会丢失一些信息。 浮点数和整数之间的转换:当将一个浮点数转换为整数时,小数部分将被丢弃,这可能会导致精度丢失。
很多人刚接触时会有疑惑:size_t和普通的无符号整型(unsigned int)有什么关系和区别?为什么在很多地方偏偏要用size_t而不是其他整数类型?...size_t 是一种无符号整数类型,其主要用途是表示对象大小(比如内存大小、数组索引等),它在C++标准库中被广泛使用,比如sizeof返回值、STL容器的.size()方法、动态内存分配函数的参数等等...在32位系统上,它通常是4字节的无符号整数;而在64位系统上,它通常是8字节的无符号整数。 为什么需要size_t? 设计size_t的核心目的是为了跨平台的适应性。...二、size_t的特性与用途 1. size_t是无符号类型 这是size_t的一个关键特性。因为它主要用于表示大小或索引,这些值在逻辑上不可能为负,因此被设计为无符号类型。...+中的一种无符号整数类型,具有独特的意义和重要性。
一.函数默认值 c++支持给函数的形式参数进行默认初始化,其规则为从右向左依此初始化。 还有以下需要注意的几点: 1.定义处可以不给出形参的默认值,在声明处可以给出形参的默认值。...3.内联函数实际上只是程序员对编译器的一种建议,其建立的基础是当调用函数函数的开销 > 执行函数的开销时,处理成内联函数是更加高效。但实际上如递归函数是不可能被处理成内联函数的。...而递归函数没有给编译器提供这样的规则。 内联函数和宏函数的区别? 内联函数和static函数的区别?...如在a.c和b.c中实现如下的两个同名的函数: 但是在c++中却支持这样的机制。为什么不会报出链接错误呢? 在一个项目,有许多源文件。每个源文件独立的进行编译,生成符号。...,不会报出链接 //错误 } (2)c程序调用c++程序 由于没有extern “c++”这样的机制,实际上c程序调用c++程序相对还是比较麻烦的,需要在c++源文件在每一个可能被c程序调用的函数外加
但是在C++语言中,两者的区别没有那么简单: 左值表达式的求值结果是一个对象或者一个函数,但是以常量对象为代表的某些左值却不能作为赋值语句的左侧运算对象 虽然某些表达式的求值结果是对象,但是它们实际上是右值而不是左值...移位运算符 左移运算符值为0的二进制位,右移运算符>>的行为则依赖其左侧运算对象的类型,如果该运算对象是无符号类型,在左侧插入值为0的二进制位;如果该运算符是带符号类型,则在左侧插入符号位的副本或值为...算术转换 整型提升:负责把小整数类型转换为大的整数类型 无符号类型的运算对象:如果一个运算对象是无符号类型,另一个运算对象是带符号类型,其中的无符号类型不小于带符号类型,那么带符号的运算对象就会转换为无符号的...带符号类型大于无符号类型时,则转换的结果依赖于机器。如果无符号类型的所有值都能存在该带符号类型类型中,则无符号类型转换为带符号类型;如果不能,则带符号类型的运算对象转换为无符号类型。...reinterpret_cast 使用reinterpret_cast是非常危险的,主要是因为类型改变了但是编译器没有给出任何警告或者错误的提示信息。
unsigned 的含义unsigned 是 C++ 中的修饰符,主要用于表示无符号数据类型。无符号类型排除了负数的可能性,使得变量仅能存储非负整数。...C++ 标准没有严格规定 short 的宽度,但要求 sizeof(short) 为 16 位。...带符号的 short:范围为 -32,768 到 32,767。无符号的 short:范围为 0 到 65,535。为什么要使用 unsigned short?...溢出演示:当 unsigned short 达到最大值后,再加 1 会回到 0,这体现了无符号整数的模运算行为。计数器用法:利用 unsigned short 计数时,可以避免负数导致的问题。...常见误区与调试技巧溢出问题无符号整数的溢出会导致意想不到的结果。
类型转换规则 隐式类型转换遵循以下基本规则: 从小范围类型到大范围类型 当数据从一个较小范围的数据类型(如 char)转换为较大范围的数据类型(如 int 或 double)时,编译器会将小范围类型的数据值...char c = 'A'; // ASCII 值为 65 int i = c; // 自动转换为 int 类型,值为 65 从大范围类型到小范围类型 当数据从一个较大范围的数据类型转换为较小范围的数据类型时...强制转换的注意事项 可能的数据丢失 转换时需注意源类型的范围是否超出目标类型的表示能力,否则会导致数据丢失或溢出。 可能的符号错误 强制转换时,符号扩展或零扩展可能会产生意外结果。...例如,将有符号整数强制转换为无符号整数时,可能导致数值变化。...注意无符号和有符号类型之间的转换 在需要处理正负数的场景中,优先使用有符号类型,避免无符号类型的错误行为。
当 x+y 时,它们的结果不变;当 2w 为 x+y-2w 3、补码加法运算 对于补码加法运算,因为补码编码是表示有符号的整数。 ...4、无符号数乘法运算 对于一个 w 位的无符号二进制整数[xw-1 , xw-2 , … , x2 , x1 , x0],其值大小满足 0 整数乘积的低 w 位表示的值。根据我们前面讲的截断原理:补码乘法运算公式为 ? 假设对于w位的两个补码数来说,它们的乘积的低w位与无符号数乘积的低w位是一样的。...无论 x 是无符号还是补码,甚至当乘法会导致溢出时,两个计算都会得到一样的结果。 更好的编译器,可能会将 14 = 24-21。...这是错误的。 ? 8、总结 那么本篇博客结束我们对于整数的表示以及运算都已经了解了。注意整数的运算我没有将减法,其实减法也就是转换为补码相加。而且计算机中也只有加法器,是没有减法器的。
1、整形范围 数字类型,由三个维度来定义: 整数 or 浮点数:int or float/double 有符号 or 无符号:signed or unsigned 长度:short or long(看编译器...2、常见错误 2.1、无意的整数外溢(OVERFLOW_BEFORE_WIDEN) 用窄长度的参数计算,然后将结果赋值给宽长度的变量,如果这个计算的结果超出了窄长度的范围,其高位会被丢弃,值保留窄长度的范围内的内容...typedef long time_t; 问:为什么time_t要被定义为一个有符号数?猜测是可以表述1970年之前的时间?...由此引申,其他的变量也是,我们可能觉得一个数一定是正数,所以把它当无符号数用,实际上如果它被定义为有符号数,那就是有风险的。...2.4、操作数不影响结果(CONSTANT_EXPRESSION_RESULT)、宏将无符号值与 0 做了比较(NO_EFFECT) 主要是对变量的范围做判断时,做了无效判断。
安全性: 使用 int 来表示对象的大小或索引可能会导致溢出或错误,尤其是当处理大型数组或数据结构时。 size_t 专门设计用于表示大小,因此使用它更安全,不太可能发生溢出。...int 是一个有符号整数类型,可以表示正整数、零和负整数。 表示范围: size_t 的表示范围取决于平台和编译器,但通常是一个足够大的无符号整数类型,能够表示任何数组或对象的大小。...在32位系统上,它通常是32位无符号整数,能够表示从0到4,294,967,295的值。在64位系统上,它通常是64位无符号整数。...int 的大小和符号性在不同的系统和编译器之间可能会有所不同,这可能会导致可移植性问题。 打印: 使用 printf 打印 size_t 类型的值时,应该使用 %zu 格式化字符串。...使用 printf 打印 int 类型的值时,应该使用 %d 或 %i 格式化字符串。 在大多数情况下,如果你只是需要一个能够存储整数值的变量,并且不关心它是否有符号,那么使用 int 是可以的。
初始化和赋值时进行的转换 int int_a = 123; long long int llong_a = int_a; //赋值的时候,编译器会先将int类型的123扩展为long类型123的新值...第一个错误好理解一点,31325远远超过了char的最大范围。 第二个错误明明x的值为66,为什么会出错呢?编译器不会管你x的值是多大,他只管x的类型是多大。...6.如果一个操作数为有符号的,另一个操作数是无符号的,且无符号操作数的级别比有符号操作数的级别高,则将有符号操作数转换为无符号操作数所属的类型。...传递参数时的转换 如果函数参数类型定义为double类型,但是传入的时int类型,这在C中会提示错误,但在C++中,C++会自动帮我我们转换为函数原型中定义的值,条件是两种都是算术类型。...auto a = 666;//编译器将为a定义为int类型 auto b = 66.66f;//编译器将为b定义为float类型,注意数值后面的f 除了我上面写的,C++还引入了4个强制类型转换运算符
要知道系统中整数的最大长度,可以使用C++工具来检查类型的长度。 首先使用sizeof运算符返回类型或变量的长度,单位为字节。 climits中包含符号常量(预处理方式)来表示类型的限制。...变量的初始化的问题,有助于防范类型转换错误。 1.5 无符号类型 优点:可以增大变量能够存储的最大值。 创建无符号类型的变量时,只需要使用unsigned来进行声明即可。...C++将非零值表示为true,将零表示为false。 bool is_ready = true; 2. const限定符 符号名称指出了常量表示的内容。 const关键字来修改变量声明和初始化。...创建常量的通用格式为: const type name = value; 例如: const int Months = 12; // 一年有12个月 如果在声明const常量时没有提供值,该常量的值将是不确定...时,而不指定变量的类型,编译器将把变量的类型设置成与初始值相同。
/长整型 long [int] [signed] long [int] //有符号的 unsigned long [int] //无符号的 //更长的整型(在C99版本被引入,C99之前是没有这个数据类型的...例子: 可见编译器并没有报错。 那如果我们省略了unsigned时又会出现什么状况呢?在回答这个问题之前,担心有C语言零基础的 读者,特别在这说明一下,等会的例子,不需要你每一条的代码都理解。...至于为什么unsigned比signed所表示的范围更大,是因为在计算机底层对于无符号的整数和有符号整数的处理方式不一样所导致的。...我们再看一下编译器给我们的报错信息,它说 “i”是未定义的标识符。可能在上面没有看懂的读者就会发出疑惑,我不是定义了过了 i ,为什么说我没定义? 其实是作用域在作祟!!!...这个就是我们接下来要讨论的问题,局部变量与全局变量同名时的情况。 废话不多说,直接上代码: 看到这里,你会惊奇的发现,编译器不仅没有报错,还给我们输出了一个值。
如下代码从语法上没有错误,但是,从变量 num_1并不能获取数据 -34,而是垃圾数据。 unsigned int num_1=-34; C++ 语言有一个让让人头大的地方。...最小值的求解可理解为无符号位的最大值减去有符号位的最大值再取反,-(4294967295-2147483647)=-2147483648。...无符号字符型 char在默认情况下既不是没有符号,也不是有符号,因为并没有编码为负数的 ASCII字符。算是留了一个可扩展余地。...但可以通过字符与整数的关系,来初始化或赋值无符号字符型变量。...unsigned char myChar=128; 有符号和无符号char所表示的范围是不相同的: signed char表示范围为 -128~127。
---- 内联函数 概念 以关键字inline修饰的函数称为内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,从而内联函数能够提升程序运行的效率。...来看这个错误: 为什么? 为什么内联函数不能像普通函数那样声明和定义分离呢?...这里将会涉及: 内联函数与普通函数比较; 而内联函数呢,在编译时,inline修饰函数并没有也不需要进入符号表(而是直接在编译时被编译器用函数体给替换了), 在编译时由于test.cpp中只有内联函数的声明...但是这并没有报错,如果这里报错应该是编译错误,但现在报的是链接错误,所以编译没问题。 在链接阶段test.o会到其他目标文件中寻找Add函数大的有效地址。...那么看链接阶段: 在链接阶段,test.o符号表中只有Add函数的无效地址(因为只是声明),而Add.o符号表中也没有Add函数的地址,导致了main函数调用了Add函数,却怎么都找不到Add函数的地址
sizeof的返回值为size_t size_t类型在32位操作系统下是unsigned int,是一个无符号的整数 int main() { int a; int b = sizeof...无符号数 无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。 当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。...ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。...printf格式字符: 打印格式 对应数据类型 含义 %d int 接受整数值并将它表示为有符号的十进制整数 %hd short int 短整数 %hu unsigned short 无符号短整数 %o...unsigned int 无符号8进制整数 %u unsigned int 无符号10进制整数 %x,%X unsigned int 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF
sizeof的返回值为size_t size_t类型在32位操作系统下是unsigned int,是一个无符号的整数 int main() { int a; int b = sizeof...无符号数 无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。 当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。 ...ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。 ...printf格式字符: 打印格式对应数据类型含义%dint接受整数值并将它表示为有符号的十进制整数%hdshort int短整数%huunsigned short无符号短整数%ounsigned int...无符号8进制整数%uunsigned int无符号10进制整数%x,%Xunsigned int无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF%ffloat单精度浮点数%lfdouble
领取专属 10元无门槛券
手把手带您无忧上云