现在的位置: 首页 > 综合 > 正文

sizeof()使用的几点注意 以及小数转二进制数

2017年12月25日 ⁄ 综合 ⁄ 共 1691字 ⁄ 字号 评论关闭

一个例子:

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符

char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到/0为止之前

int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''/0''结尾的

char q[]="abc";
char p[]="a/n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2     

第二个例子:

class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上

第三个例子:

char szPath[MAX_PATH]

  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)

 * 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
   * 2.sizeof是算符,strlen是函数
   * 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'/0'结尾的。
sizeof还可以用函数做参数,比如:

      short f();
      printf("%d/n", sizeof(f()));

      输出的结果是sizeof(short),即2。
    * 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

注意编译器进行内存边界对齐 

struct sample2
{
    char a;     ///1
    int b;        ///4
};
#pragma pack( 8 )
    /// 1 + 4  = 5 —> 8(  8 —> 4  )

#pragma pack( 16 )
    /// 1 + 4 = 5 —> 8( 16 —> 4  )

    说明:#pragma pack告诉编译器进行内存边界对齐,一般都是采用编译器的设置对整个项目采用同一对齐方案,而且通常为缺省8字节对齐。 

 

补充一个——小数转2进制数

问:0.1十进制怎么转换成其他进制了?如八进制

可以先转换成二进制,用乘二取整法先转换  
  算式               整数  
      0.1  
  *       2  
  ------  
      0.2   ……   0       /小数点后第一位  
  *       2  
  ------  
      0.4   ……   0  
  *       2  
  -----  
      0.8   ……   0  
  *       2  
  ------  
      1.6   ……   1  
  ---》注:剩小数  
      0.6  
  *       2  
  -----  
      1.2   ……   1  
  ---》  
      0.2  
  *       2  
  ------  
      0.4   ……   0  
  ……  
  ……  
  ……  
  ……下面好象是个循环了  
   
  结果     0.1D   =     0.00011B   //这里精确到小数点后5位  
           
  二进制再可以转化为其他进制,如八进制  
  方法是从小数点后三位一组,后面不够则加0,然后每组里,进行二进制和八进制的转化    
    上面的就是   0.   000   110   B     =   0.06   O  
   
  二进制再可以转化为十六进制,跟八进制方法相同  
  唯一区别就是小数点后要四位一组  

抱歉!评论已关闭.