整型数据范围
基本整型范围为啥后是-32768 ~ 32767 ??取值范围不应该所有位相加也就是2^1+...+2^15??? 还有字节是咋算的??为啥2字节就是16位2进制~4字节就是32位位进制??
因为计算机内表示数值使用的是补码,而不是原码,所以你才有这样的疑问。下面我简单解释一下你就明白了。 原码就是这个数本身的二进制形式。 以8位二进制为例 0000001 就是+1 1000001 就是-1 补码分为两种情况:1、正数的补码与原码一样;2、负数的补码是符号位保持不变,其余各位取反,再加1。
反码就是负数符号位不变,其余各位取反,正数反码与原码相同。 以四位二进制为例,其原码、反码、补码为: 真值 原码 反码 补码 7 0111 0111 0111 6 0110 0110 0110 5 0101 0101 0101 4 0100 0100 0100 3 0011 0011 0011 2 0010 0010 0010 1 0001 0001 0001 0 0000 0000 0000 -0 1000 1111 0000 -1 1001 1110 1111 -2 1010 1101 1110 -3 1011 1100 1101 -4 1100 1011 1100 -5 1101 1010 1011 -6 1110 1001 1010 -7 1111 1000 1001 为什么要设立补码呢? 第一是为了能让计算机执行减法:[a-b]补=a补+(-b)补 第二个原因是为了统一正0和负0 正零:00000000 负零:10000000 这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000 16位二进制原码表示的负数是 -0~-32767,包括-0加起来是32768个数;因为补码加了1,所以补码的表示范围是 -1~-32768,也是32768个数。 n位补码能表示的范围的公式是 -2^(n-1)到2^(n-1)-1 比n位原码能表示的数多一个 。
问:挺简单的一C函数,不过我是初学者,暂时还不会写,请好心人多多帮忙!
答:int mystrlen(char *str) { int n = 0; while (*str) { n++; str++;} return n; } voi...详情>>