【自用】 memset对于int、long long、float、double 的极值怎么清

本文通过实验代码展示了C语言中不同数值类型如int、long long、float和double的边界值特性及其运算行为,对于理解这些类型在溢出等情况下的表现具有一定的参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢");
    puts("网址:blog.youkuaiyun.com/vmurder/article/details/46537613");
}

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

实验代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5
using namespace std;
int a[N];
long long b[N];
float c[N];
double d[N];
void _int()
{
    puts("");
    puts("int:");

    puts("");
    memset(a,0x7f,sizeof a);printf("%d\n",a[0]);
    memset(a,0x80,sizeof a);printf("%d\n",a[0]);
    memset(a,0x81,sizeof a);printf("%d\n",a[0]);

    puts("");
    memset(a,0xbf,sizeof a);printf("%d %d\n",a[0],a[0]*2);
    memset(a,0xc0,sizeof a);printf("%d %d\n",a[0],a[0]*2);
    memset(a,0xc1,sizeof a);printf("%d %d\n",a[0],a[0]*2);

    puts("");
    memset(a,0x3e,sizeof a);printf("%d %d\n",a[0],a[0]*2);
    memset(a,0x3f,sizeof a);printf("%d %d\n",a[0],a[0]*2);
    memset(a,0x40,sizeof a);printf("%d %d\n",a[0],a[0]*2);

    puts("");
    memset(a,0x7e,sizeof a);printf("%d\n",a[0]);
    memset(a,0x7f,sizeof a);printf("%d\n",a[0]);
    memset(a,0x80,sizeof a);printf("%d\n",a[0]);
}
void _long()
{
    puts("");
    puts("long long:");

    puts("");
    memset(b,0x7f,sizeof b);printf("%I64d\n",b[0]);
    memset(b,0x80,sizeof b);printf("%I64d\n",b[0]);
    memset(b,0x81,sizeof b);printf("%I64d\n",b[0]);

    puts("");
    memset(b,0xbf,sizeof b);printf("%I64d %I64d\n",b[0],b[0]*2);
    memset(b,0xc0,sizeof b);printf("%I64d %I64d\n",b[0],b[0]*2);
    memset(b,0xc1,sizeof b);printf("%I64d %I64d\n",b[0],b[0]*2);

    puts("");
    memset(b,0x3e,sizeof b);printf("%I64d %I64d\n",b[0],b[0]*2);
    memset(b,0x3f,sizeof b);printf("%I64d %I64d\n",b[0],b[0]*2);
    memset(b,0x40,sizeof b);printf("%I64d %I64d\n",b[0],b[0]*2);

    puts("");
    memset(b,0x7e,sizeof b);printf("%I64d\n",b[0]);
    memset(b,0x7f,sizeof b);printf("%I64d\n",b[0]);
    memset(b,0x80,sizeof b);printf("%I64d\n",b[0]);
}
void _float()
{
    puts("");
    puts("float:");

    puts("");
    memset(c,0xfd,sizeof c);printf("%f\n",c[0]);
    memset(c,0xfe,sizeof c);printf("%f\n",c[0]);
    memset(c,0xff,sizeof c);printf("%f\n",c[0]);

    puts("");
    memset(c,0xcd,sizeof c);printf("%f %f\n",c[0],c[0]*2);
    memset(c,0xce,sizeof c);printf("%f %f\n",c[0],c[0]*2);
    memset(c,0xcf,sizeof c);printf("%f %f\n",c[0],c[0]*2);

    puts("");
    memset(c,0x4e,sizeof c);printf("%f %f\n",c[0],c[0]*2);
    memset(c,0x4f,sizeof c);printf("%f %f\n",c[0],c[0]*2);
    memset(c,0x50,sizeof c);printf("%f %f\n",c[0],c[0]*2);

    puts("");
    memset(c,0x7e,sizeof c);printf("%.15f\n",c[0]);
    memset(c,0x7f,sizeof c);printf("%.15f\n",c[0]);
    memset(c,0x80,sizeof c);printf("%.15f\n",c[0]);
}
void _double()
{
    puts("");
    puts("double:");

    puts("");
    memset(d,0xfd,sizeof d);printf("%lf\n",d[0]);
    memset(d,0xfe,sizeof d);printf("%lf\n",d[0]);
    memset(d,0xff,sizeof d);printf("%lf\n",d[0]);

    puts("");
    memset(d,0xc1,sizeof d);printf("%lf %lf\n",d[0],d[0]*2);
    memset(d,0xc2,sizeof d);printf("%lf %lf\n",d[0],d[0]*2);
    memset(d,0xc3,sizeof d);printf("%lf %lf\n",d[0],d[0]*2);

    puts("");
    memset(d,0x42,sizeof d);printf("%lf %lf\n",d[0],d[0]*2);
    memset(d,0x43,sizeof d);printf("%lf %lf\n",d[0],d[0]*2);
    memset(d,0x44,sizeof d);printf("%lf %lf\n",d[0],d[0]*2);

    puts("");
    memset(d,0x7e,sizeof d);printf("%lf\n",d[0]);
    memset(d,0x7f,sizeof d);printf("%lf\n",d[0]);
    memset(d,0x80,sizeof d);printf("%lf\n",d[0]);
}
int main()
{
    _int();
    _long();
    _float();
    _double();
}
<think>嗯,用户想了解如何用memset初始化long long类型的变量。首先,我得回忆一下memset函数的作用。根据引用[1]和[2],memset是用来将某块内存的前n个字节设置为特定的int型值c。这里的关键是,memset按字节操作,而不是按数据类型的大小。 那long long类型通常占8个字节,对吧?如果用memset来初始化,比如想把它设为0,可以写memset(&var, 0, sizeof(var)),这样每个字节都被设为0,整体就是0。但是如果用户想设为其他值,比如全1,那可能有问题。比如用memset(&var, 1, sizeof(var))的话,每个字节变成0x01,整个long long变量实际上是0x0101010101010101,而不是1。这可能会导致数值不符合预期。 所以需要告诉用户,memset适合将内存块设置为0或-1(因为补码下-1的所有位都是1),但其他值可能会有意外结果。比如,对于非零值,可能需要用循环赋值而不是memset。另外,要注意结构体或数组的情况,这时候用memset初始化整个结构体或数组为0比较方便,但对于非零值要小心。 还有,用户可能需要例子。比如正确和错误的用法对比。比如初始化数组为0是对的,但初始化单个long long变量为全1是错的,应该用循环或者直接赋值。另外,跨平台的问题,不同系统long long的大小可能不同,所以最好用sizeof来确保正确性。 总结下来,回答应该分步骤:首先说明memset的原理,然后适用场景(0和-1),接着其他值的注意事项,给出示例代码,最后注意事项如结构体、跨平台等。同时要提醒用户避免常见错误,比如误用非0值。</think>### 使用`memset`初始化`long long`类型变量的方法及注意事项 #### 1. **`memset`的基本原理** `memset`函数的作用是**按字节填充内存**,将指针`s`指向的内存区域的前`n`个字节设置为整型值`c`的低8位(即`c`会被隐式转换为`unsigned char`)[^2]。例如,`memset(&a, 0, sizeof(a))`会将变量`a`的所有字节设为`0x00`。 #### 2. **初始化`long long`的适用场景** - **全零初始化**: 若需将`long long`变量所有字节设为`0`,可直接使用`memset`: ```c long long num; memset(&num, 0, sizeof(num)); // 正确:所有字节设为0,等价于num = 0 ``` - **全`-1`初始化**: 若需将`long long`变量所有字节设为`0xFF`(即`-1`的补码表示): ```c memset(&num, 0xFF, sizeof(num)); // 正确:所有字节设为0xFF,等价于num = -1 ``` #### 3. **非0/非-1值的注意事项** 若尝试将`long long`设为其他值(如`1`),会导致**按字节重复填充**,而非整体赋值。例如: ```c memset(&num, 1, sizeof(num)); // 错误:实际值为0x0101010101010101(非1) ``` 此时应直接赋值或通过循环逐字节操作。 #### 4. **示例代码对比** - **正确用法(全零初始化)**: ```c long long array[10]; memset(array, 0, sizeof(array)); // 正确:数组所有元素初始化为0 ``` - **错误用法(非零初始化)**: ```c long long num; memset(&num, 0x3F, sizeof(num)); // 错误:每个字节为0x3F,整体值为0x3F3F3F3F3F3F3F3F ``` #### 5. **其他注意事项** - **结构体中的`long long`成员**: 若结构体包含`long long`字段,使用`memset`初始化整个结构体为0是安全的。 - **跨平台兼容性**: `long long`的大小固定为8字节(C标准),但需确保`sizeof`正确计算内存长度[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值