c语言初学者求解关于负数补码存储

首先,我懂负数如何储存。

负数在内存中是补码保存的,如32位的话,
-1的保存就和八进制的37777777777、以及十六进制的ffffffff一样了。
原理我也懂,但是,这样一个数我哪知道到底是几?
-2就成了fffffffe,这让我十分费解。
难道是说,负数不用八进制、十六进制输出吗?
研究两天这玩意,新人的脑袋实在有限。

出去晒晒太阳吧,原理明白了就好,没必要钻牛角尖。

计算机存储都是二进制,八进制和十六进制亦或十进制都是用来输入输出表示的,如果你的程序用来编辑或显示内存实际数据,一般用十六进制显示,因为十六进制相对二进制简短而且1位16进制对应4位二进制,非常整齐,为了方便。如果你的程序用来计算一般应用,则以10进制显示,同样为了方便,特殊要求可以用其他任意进制显示,根据你需求哪个方便用哪个。

编程语言中,如果定义为整数(int),计算机遇到负数就以补码表示,此时0xffff即为-1;如果定义为uint,则不允许赋值负数(强制转换除外),如果其值为0xffff,则表示正的65535。所以关键在于定义(事先约定)。

而当你得到一个数据0xffff,如果不告诉你约定,或者说数据类型,你是无法知道到底表示-1还是65535的,计算机也如此。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-03-02
首先有符号数和无符号数是两种数,同一个数,0xffff(0x表示16进制)如果是无符号数,那么对应10进制是65535,而如果是有符号数,那么第一位是表示符号,所以是 -1追问

别讲原理,我都懂,只是编程中输入负数用八、十六进制表示都成了“正数”

第2个回答  2015-03-02
printf("%ux")无符号十六进制
printf("%x")十六进制
printf("%uo")无符号八进制
printf("%o")八进制
计算机知道他在干嘛就行了。
相似回答