c语言x2-x1>0.000001什么意思

如题所述

第1个回答  2022-12-13
《C语言深度剖析》一书中看到下面这个问题,正好趁此机会,把这个数据类型的长度问题理清一下。下面的这段程序会输出什么值?

#include<stdio.h>

int main(){
char a[1000];
int i;
for(i = 0; i < 1000; i++){
a[i] = -1 - i;
}
printf("strlen(a) = %d\n",strlen(a));
return 0;
}
登录后复制

刚看到这个问题的时候,云里雾里的,这是什么鬼,一般想到的就是1000了。但是其实输出之后是255。

要弄清这个问题,有两个点:1、strlen函数计算长度时是怎么算的?2、char型数据的值得大小范围。

对于第一个问题,这里先提一点,很多时候我们不是太清楚sizeof和strlen的区别,记住一点:sizeof是关键字,不是函数;而strlen是函数。在strlen计算一个字符串的长度的时候,它遇到字符串结束符“\0”时就结束了,并且这结束符不会计算在长度里面。那么上面怎么到256的时候就结束了呢?
下面说明第二个问题,不管是在32位还是64位的机器,char数据都是一个Byte的(8位),那么就是说对于有符号数,它表示的范围是-128~127;对于无符号数,它表示的范围是0~255。在计算机中,我们的数是用补码的形式来存储的,用补码的好处就是在表示负数的会方便一些。在我们本科的课程当中,我们知道正数的补码就是它本身;而负数的补码就是该数的绝对值的原码按位取反然,然后整个数加1。还有一个知识点就是在表示数据的时候,最高位如果是1,表示这个数是负数,0则表示这个数是正数。

举个栗子!对于-1,它的绝对值是1,表示为00000001,那么取反就是11111110,在加上1就是11111111,也就是0xFF了。

当到a[127]的时候,也就是-128,即char型数据能表示的最小的负数,接下来就是-129,它的绝对值是129,二进制为10000001,取反为01111110,那么它的符号位就没有了,除非有9位才能保存它的符号位了,然后加1就是01111111,即0x7F。一直循环下去,到a[255]的时候,对于-256,它的绝对值的十六进制就是0x100了。最高位会被丢弃,因为之后8位的空间。最终得到的也是一个0。当srelen函数遇到0的时候,也就结束了,所以它最后的打印值就是255,即从a[0]到a[254]。

在64位机器上面测试这个基本数据类型的长度,测试程序和结果如下。

#include<stdio.h>
int main(){
char c;
short s;
int i;
long l;
float f;
double d;
printf("sizeof(char) = %d\n",sizeof(c));
printf("sizeof(short) = %d\n",sizeof(s));
printf("sizeof(int) = %d\n",sizeof(i));
printf("sizeof(long) = %d\n",sizeof(l));
printf("sizeof(float) = %d\n",sizeof(f));
printf("sizeof(double) = %d\n",sizeof(d));
return 0;
}
登录后复制

C语言
strlen
补码
数据长度
生肖羊:1979年生的人,43岁后财富、婚姻、事业走向变数(免费)!
生辰运势测算 仅供娱乐
广告