数据部分

(1)把long型数据赋值给short型数据会发生二进制截断的现象,如果long型数据的大小恰好在short的范围之类,那么程序将正常运行,不会出现异常。如果long型数据的范围超过了short 的范围那么short类型数据将只能的到long型二进制数据的一部分。而且是有低位向高位赋值的数据。

(2)C语言里面,默认%f是小数点后6位,如果想小数点后面16位,写成%.16lf

不会自动四舍五入的,double是一个近似值,通常没有办法做的很精确.精确到16位十进制数。float,数据以32位二进制形式存入内存单元双精度型:double,数据以64位二进制形式存入内存单元当一个变量的值超过了变量所能表示的范围时,将产生溢出。一个变量只能赋给与之类型相匹配的变量

         深度剖析 。

     float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:

 float:
 1bit(符号位) 8bits(指数位) 23bits(尾数位)
 double:
 1bit(符号位) 11bits(指数位) 52bits(尾数位)
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024。
其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;
double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

(3)是否存在编译器选项禁止修改字符串常量

ANSI   C明确说明:修改字符串常量,效果是未定义的。 首先我们得清楚,如何才能得到字符串常量?只有一种方式:char*   szString   =   “Hello,world!”;这个声明得到一个字符串常量。那么char   szString[]   =   “Hello,world!”;可以吗?不可以!这样得到的是字符串变量。

     如果必须修改字符串就没有办法呢?有!一定有!请注意:我们要的效果是修改字符。因此,只需要定义字符串变量,而不是字符串常量。前面说过,可以用数组的方式定义char   szString[]   =   “Hello,world!”;;这样,在程序中就可以修改字符串了。  

  试试下面代码:  
  #include<stdio.h>  
  #include<stdlib.h>  
   
  int  
  main(   int   argn,   char*   argv[]   )  
  {  
          char   szStringA[]   =   "Hello,world!";  
          char   szStringB[]   =   "Hello,world!";  
   
          szStringA[0]   =   '-';  
          puts(   szStringB   );  
   
          return   0;  
  }  
  没问题了吧。  
  OK,最后请记住:需要修改字符串,那么用char   szString[]   =   “Hello,world!”;进行声名!

 (4)float的范围比int的范围更大些,但是如果float的范围并不比int 的范围大,由于在浮点数的表示方法中0的表示方法就有多种,而且通过使用不规范的形式,其他的值有多种不同的表达形式,因此float所表达的值在这中种情况下会比int型的少。