本文内容只作为借鉴用,如有错误望指出.
相信大家都了解原码和补码的转换关系,若不知道百度一下很多解释的.我主要想阐述下其中在编译器(VC6.0)和内存中得分布情况.
首先计算机所有数字存储都是通过原码的形式,这样只用加法就解决了减法的问题.
在c或者c++下,只以char为例子(其他类型原理相似).char 占用1个字节,范围是[-128,127) [0,255);
char为什么能表示-128; 这是一种规定将-0 即10000000 表示成-128, -0在内存中得补码表示就是10000000;所以是[-128,127);
实例:
char x = -127; //在内存中得形式 0xxxxxx 0x81 ; 即位10000001 -127的补码形式,
//在内存中是如此表示的,计算机不知道他到底是有符号还是无符号
//而程序拿过来用时你的类型是否为有符号进行翻译的
//有符号的情况翻译成-127 , 无符号的话就翻译成129
/
unsigned char x = -127; //无符号的,默认是有符号的. 编译器并不会根据类型你的赋值进行检测, 将-127转换成补码存储到内存中 10000001
printf("%d",x); //输出结果是 129. 这时候编译器会根据x的类型对10000001进行转换,到底是129或者是-127是由你输出的类型而定的