鱼C论坛

 找回密码
 立即注册
查看: 2226|回复: 5

[技术交流] C中sizeof讨论

[复制链接]
发表于 2014-10-17 15:22:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-10-18 13:34:15 | 显示全部楼层
char类型相当于一个占有一个字节的小整型。
而上面把a赋值为-10 ,这个-10表示的是一个数值,而不是一个字符。
其中-10的16进制表示就是fffffff6  
当你打印的时候就会打印这个ffffff6
另外一个就是说char类型占有的字节大小,显然是1个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2014-10-30 18:01:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-4 09:02:25 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-4 10:59:58 From FishC Mobile | 显示全部楼层
为什么不用-10的源码表示而是用补码表示呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-18 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表