dami913320205 发表于 2014-10-17 15:22:34

C中sizeof讨论

void main()
{
        char a=-10;
        printf("%0x",a);
        printf("%d",sizeof(a));
}
请问这段代码的运行结果怎么是
ff ff ff f6 和 1

微笑的好吧 发表于 2014-10-18 13:34:15

char类型相当于一个占有一个字节的小整型。
而上面把a赋值为-10 ,这个-10表示的是一个数值,而不是一个字符。
其中-10的16进制表示就是fffffff6
当你打印的时候就会打印这个ffffff6
另外一个就是说char类型占有的字节大小,显然是1个字节

machimilk 发表于 2014-10-18 14:12:16

void main()
{
         char a=-10;
         printf("%0x",a);
         printf("%d",sizeof(a));
}
请问这段代码的运行结果怎么是
ff ff ff f6 和 1
第一行打印a a是-10 整数型的-10 在内存中的表示方法涉及到二进制
先把10看成正数 二进制的10是       1010 在32位系统就是在前面补28个0就是
00000000 00000000 00000000 00001010
第一位是符号位0表示正数 1表示负数
那么-10就应该是
10000000 00000000 00000000 00001010
然后除了第一位的符号位以外取反就是0变1 1变0 之后就变成了
11111111 11111111 11111111 11110101
取反之后再加1就变成了
11111111 11111111 11111111 11110110
对应16进制就是
ff            ff                ff            f6
最后给你摘抄一段文字
原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。
反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.

还有
printf("%d",sizeof(a));
a是char类型 就是占用1个字节
所以你sizeof算出来的就是1
如果你用int a=-10,那么你在32位系统上面用sizeof(a),结果一定是4


大个的糖果 发表于 2014-10-30 18:01:08

tlwangxd 发表于 2014-11-4 09:02:25

学习

weihuiwei123 发表于 2014-11-4 10:59:58

为什么不用-10的源码表示而是用补码表示呢?
页: [1]
查看完整版本: C中sizeof讨论