int main()
}
以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数
相加时,如果最高位(符号位)有进位,则进位被舍弃。正数的补码与其原码一致;负数的
补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。
时,a[127]的值为-128,而-128 是char 类型数据能表示的最小的负数。当i 继续增加,a[128]
的值肯定不能是-129。因为这时候发生了溢出,-129 需要9 位才能存储下来,而char 类型
数据只有8 位,所以最高位被丢弃。剩下的8 位是原来9 位补码的低8 位的值,即0x7f。
当i 继续增加到255 的时候,-256 的补码的低8 位为0。然后当i 增加到256 时,-257 的补
码的低8 位全为1,即低八位的补码为0xff,如此又开始一轮新的循环……
算字符串长度的,并不包含字符串最后的‘\0 ’。而判断一个字符串是否结束的标志就是看
是否遇到‘\0 ’。如果遇到‘\0 ’,则认为本字符串结束。
类型默认情况下是有符号的,其表示的值的范围为[-128,127],超出这个范围的值会产生溢
出。另外还要清楚的就是负数的补码怎么表示。弄明白了这两点,这个问题其实就很简单了
问题1:
int i = -20;
unsigned j = 10;
i+j 的值为多少?为什么?
解答1:int和unsigned int运算时int会自动转成unsigned int
int和unsigned int都是4字节(32位情况下)存储,区别是int最高位是符号位,用来表示正负
负数用补码存储,-20存储为111111111111111111111111
解答2:这要看你的i+j的输出格式的
问题2:
下面的代码有什么问题?
解答:原因是
因为 i 被定义为无符号的整数。