memset用法 & int、long long、float、double 的极值怎么清

memset用法 & int、long long、float、double 的极值怎么清

memset 是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部(以字节为单位)设置为指定的值。在竞赛中,常用来进行数组的初始化。

memset 函数原型定义如下:

// 函数解释:将 ptr 中当前位置后面的 num 个字节用 value 替换并返回 ptr
// 其中,size_t 其实就是  unsigned int
void * memset ( void * ptr, int value, size_t num );

Copy

正因为 memset 函数是以字节为单位赋值的,所以使用它并不能将数组元素修改为任意值,而竞赛中又常常需要将数组初始化为 0、最大值或最小值。写循环赋值的话,也不是不可以,不过显得不那么“优雅”,针对这一点,下面整理了使用 memset 实现数组初始化的一些常用方法。

1、memset 可以对 字符数组 进行赋值吗?

可以的,比如将字符数组 s 全部初始化为 ‘#’ 字符,就可以使用下面的方法:memset(s, '#', sizeof s); 。不过使用memset 对 字符 进行赋值很少使用,除了在一些字符迷宫搜索类的题目外。

需要注意:memset 无法对 string 字符串进行赋值!想对字符串进行赋值,请使用 string.resize() 函数。

2、memset 对 布尔型数组 进行赋值吗?

INT_MAX=2^{31}-1231−1=2147483647

INT_MIN=-2^{31}−231=-2147483648

”较大/小“的优点:加法不爆。

int

极大值:0x7f
较大值:0x3f
较小值:0xc0
极小值:0x80

long long

”较大/小“的优点:加法不爆。
极大值:0x7f
较大值:0x3f
较小值:0xc0
极小值:0x80

float

”较大/小“的优点:保证一定位精度。
7f以上一直到be都是-0 (实际上是一个很小的>-1.0的负数)
极大值:0x7f
较大值:0x4f
较小值:0xce
极小值:0xfe
0xff是 -1.#QNAN0000…… (-∞?)

double

”较大/小“的优点:保证一定位精度。
极大值:0x7f
较大值:0x43
较小值:0xc2
极小值:0xfe

C中常量INTMAX和INTMIN分别表示最大、最小整数,定义在头文件limits.h中。

1. INTMAX,INTMIN数值大小

因为int占4字节32位,根据二进制编码的规则,INTMAX = 2^31-1,INTMIN= -2^31。C/C++中,所有超过该限值的数,都会出现溢出,出现 warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占 8 字节 64 位。

2. 关于INTMAX INTMIN的运算

由于二进制编码按原码、补码和反码的规则进行运算,所有程序中对INTMAX和INTMIN的运算应当格外注意,在出现溢出的时候,不遵循数学规则。

INTMAX + 1 = INTMIN

INTMIN - 1 = INTMAX

abs(INTMIN) = INTMIN

比较有趣的是,INTMAX + 1 < INTMAX, INTMIN - 1 > INTMIN, abs(INT_MIN) < 0.

常见数据类型及所占的字节数

知识储备:1Byte=8bit,1KB=1024Byte=2^10,1MB=1024KB,1GB=1024MB,1TB= 1024GB

数据类型32位编译器64位编译器数据范围
char11-128~127
unsigned char110~255
char* (即指针变量)48由系统寻址范围决定
bool11false、true(0 或 1)
short int22-32768~32767
int44-2147483648~2147483647
unsigned int440~4294967295
float44(1.17549e-038)~(3.40282e+038)
double88(2.22507e-308)~(1.79769e+308)
long48不确定
long long88-9223372036854775808~9223372036854775807(即-2^63~2^63-1)
unsigned long long880~1844674407370955161(即0~2^64-1)
string————在c++中属于类类型,不是基本数据类型

说明:

(1)char的默认类型不确定有可能是unsigned,也有可能是signed,主要更具编译器而定,可以自己测试一下编译器的默认char的符号类型

(2)因为 long 在不同编译器下的位数不同,所以当数据范围超过 int 范围时,建议使用 long long 类型。

(3)浮点数在 内存中都是按科学计数法来存储的,浮点数的精度是由尾数的位数决定的,float 精度 6~7 位,double 精度 15~16位(不是小数点后精度);

(4)字符串string:由于string在c++中属于类类型,不是基本数据类型,类不能计算其在内存中所占大小,使用sizeof(string)来算出来的结果不是其真实大小,string类里面有计算其字节大小的函数如:size(),length()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10247D

我会继续努力,信息技术会越好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值