您的位置:首页 > 其它

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

2007-03-01 11:08 399 查看
一个例子:

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

二进制再可以转化为十六进制,跟八进制方法相同
唯一区别就是小数点后要四位一组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: