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位编译器 | 数据范围 |
---|---|---|---|
char | 1 | 1 | -128~127 |
unsigned char | 1 | 1 | 0~255 |
char* (即指针变量) | 4 | 8 | 由系统寻址范围决定 |
bool | 1 | 1 | false、true(0 或 1) |
short int | 2 | 2 | -32768~32767 |
int | 4 | 4 | -2147483648~2147483647 |
unsigned int | 4 | 4 | 0~4294967295 |
float | 4 | 4 | (1.17549e-038)~(3.40282e+038) |
double | 8 | 8 | (2.22507e-308)~(1.79769e+308) |
long | 4 | 8 | 不确定 |
long long | 8 | 8 | -9223372036854775808~9223372036854775807(即-2^63~2^63-1) |
unsigned long long | 8 | 8 | 0~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()