c负数存储
c的char数据属于基本类型,基本类型其中还包括-整型,实型,枚举类型!
数据在内存中是以二进制形式存放的。数值是以补码表示的。
整型:
一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”
实型:
在内存中占4个字节,是按照指数形式存储的,实型数据分为小数部分和指数部分,分别存放!计算机用二进制表示小数部分,用2的幂次来表示指数部分!
字符型:
在内存中字符的存储实际上是把字符相对应的ASCII代码放到存储单元中的。而这些ASCII代码值在计算机中也是以二进制形式存放的。这个与整型的存储很相似。因此这两类之间的转换也比较方便!
B. 关于在C语言中无符号整形存储负数问题
你的理解是对的。
最高位为1时,对于有符号来说,这个数是负数,而对于无符号数而言,由于最高位也是有效存储位,所以可以存储更大范围的数。
话再说回来,既然是无符号数,输出格式应该是"%u",而不是"%d",这样才能做到“表里如一”,“改头换面”只会乱了自己,这不是游戏,严谨是必须的。
C. 在c语言中怎么表示负数。
第一位符号位1为负,0为正。 正数的补码和2进制原码是一样的。
负数的补码:
1、先取绝对值|x| ;
2、对|X|+1 ;
3、对|X|+1 取反,就得到它的补码了 。
计算机中存放整型数据都是按补码的形式存放的。

(3)c负数存储扩展阅读:
有符号数的表示方法是由硬件决定,而不是由C决定的。有三种表示方法:
1、二进制原码
0000 0001 表示 1
1000 0001 表示 -1
这个方法有个缺点是有两个零: +0 和 -0。这会引起混淆,而且用两个位组合来表示一个值也有些浪费。
2、二进制补码(最普遍的系统)
区别在于 singned 和 unsigned:
1)如果是无符号字节, 1000 0000 该组合为 128
2)如果是有符号字节, 1000 0000 该组合为 -128
第一种表示数的范围是 0 ~ 255;
第二种表示数的范围是 -128 ~ +127,对于一个二进制补码数取负数,最简单的方法就是取反、加 1。
3、二进制反码
通过反转位组合中的每一位以形成一个数的负数,例如:
0000 0001 表示 1
1111 1110 表示 -1
这种方式也有一个 -0:1111 1111。其范围是 -127 ~ +127。
D. c语言初学者求解关于负数补码存储
出去晒晒太阳吧,原理明白了就好,没必要钻牛角尖。
计算机存储都是二进制,八进制和十六进制亦或十进制都是用来输入输出表示的,如果你的程序用来编辑或显示内存实际数据,一般用十六进制显示,因为十六进制相对二进制简短而且1位16进制对应4位二进制,非常整齐,为了方便。如果你的程序用来计算一般应用,则以10进制显示,同样为了方便,特殊要求可以用其他任意进制显示,根据你需求哪个方便用哪个。
编程语言中,如果定义为整数(int),计算机遇到负数就以补码表示,此时0xffff即为-1;如果定义为uint,则不允许赋值负数(强制转换除外),如果其值为0xffff,则表示正的65535。所以关键在于定义(事先约定)。
而当你得到一个数据0xffff,如果不告诉你约定,或者说数据类型,你是无法知道到底表示-1还是65535的,计算机也如此。
E. 为什么c语言负数是以补码形式存放的
为什么 C 语言负数是以补码形式存放的?
------------------
这个事,和 C 语言没有任何关系。
因为,计算机本身,它就是“用补码存储正负数字”。
C 语言的程序,在计算机中运行,也就必须“用补码存储正负数”。
而且,无论你用任何编程语言编写程序,负数,都是用补码存放的。
F. 关于C语言负数的存储问题。
首先要理解这个范围怎么来的
因为 char 和 unsigned char 是1个字节,一个字节=8个位,即1byte=8bit,计算机能用8个位表示的最大值就是1111 1111,即255,这是uchar 的,char型数据第8位是正负数的,所so char (-128 ~+127) 即 (正负)111 1111 ,超出范围的赋值,就不确定它会被计算机理解成什么了,你可以写个测试代码看一下
