关于C语言初级:32767+1为什么成32768
正如读者的迷惑,若干C语言的教材里指明int类型的变量占用内存2字节,取值范围-32768~32767,为什么输出32767+1会得到32768的答案,这不是超出了int的表达范围薯歼族吗?
原因在于,部分新教材都仍沿用以前的标准C教材,而老的教材以标准16位版本的C编译器为蓝本。所以有int类型的变量占用内存2字节,取值范围-32768~32767的说法。而现在我们所使用的编译器多数为32位的编译器,表达int类型的变量占用数弊4字节,取值范围-2147483648~2147483647,前面读者一定也是使用32位的C编译器,而改兆看的教材却是16位版本的,所以会产生这个疑问。
对于16位或32位的编译器怎么表达整数,在此不再赘述。
测试你的C编译器是16还是32位,只要printf("%d",sizeof(int));如果显示2,说明是16位的,显示4则是32版本的。以下是16位与32位编译器的对比。
这是16位C编译器win-TC运行结果:
这是32位C-Free运行相同程序的结果:
同样,呼吁研究C语言教材的作者们一定要在书本上注明教材配套的软件,不要让读者产生过多的迷惑。也期望本文对初学者有点帮助……
得注意补码的使用规则,当数字是正数时,其存储用数字原码存储;当数字为负数时用其取反+1存储。其中就有个特别的数字0,其非正非负,如果算为正数用原码存储是0000 0000 0000 0000,如果算为负数用补码存储是1111 1111 1111 1111+1=0000 0000 0000 0000。从而1000 0000 0000 0000可以节约出来表示宽碧其他数字。如果是负数取反+1后得到的,反推回去后还是1000 0000 0000 0000,没有意义;如果是正数可以直接表示32768,为颂瞎节约资源,一般系统直接把1000 0000 0000 0000定慎樱举义为32768
2010-01-02