关于memset的小实验

关于memset的小实验

  • memset是包含在的函数,用来给字符数组赋值。
  • 然而人们常常把它拿来给整型变量赋值。
void *MEMSET (void *dstpp, int c, size_t len)
  • memset是一个返回通用指针的函数,返回的地址便是输入的地址

  • int c表示对这块内存的赋值

  • len是内存的长度

  • memset是按照字节来赋值的,但是int类型是4个字节的。

简单的情况

  • c = -1时,-1的原码是10000000 00000000 00000000 00000001,反码是11111111 11111111 11111111 11111110,补码是1111111 11111111 11111111 11111111(32位)

  • 猜测截取最低8位一个字节,在内存中最低位的地址编号小和书写顺序相反,相当于截取4字节内存的前8位,对每个字节赋值。

  • 笔者这里指的是【小端机器】。

    #include 
    //#include 
    #include 
    int main(int argc, char* argv[]) {
        int a[4];
        memset(a, 128, sizeof(a));
        printf("%d\n", a[0]);
        printf("%d\n", a[1]);
        printf("%d\n", a[2]);
        printf("%d\n", a[3]);
        
        return 0;
    }
    
  • 每个字节都赋值11111111而int类型读取4个字节,故此时int的值为11111111 11111111 1111111 11111111是-1的补码,所以a[0]=1。

  • 关于memset的小实验_第1张图片

  • 同样的0赋值后也是0(-0和+0的补码均是00000000 00000000 00000000 00000000)。

其他情况

  • 例如c=3 原码 00000000 00000000 00000000 00000011 反码 00000000 00000000 00000000 00000011 补码 00000000 00000000 00000000 00000011截取8位 00000011(正数三者一致)
  • 拷贝四次00000011 00000011 00000011 00000011 反码 00000011 00000011 00000011 00000011原码 00000011 00000011 00000011 00000011 为

关于memset的小实验_第2张图片

  • 运行一下,确实如此。
  • 关于memset的小实验_第3张图片

你可能感兴趣的:(C)