今天在看一本objective-c的教程,里面第6章讲到关于整数。
里面有一段话,摘抄如下:
通常会用第3章介绍过的带描述性的类型来声明整数。
char a;//8
short b;//通常是16位(视平台而定)
int c;//通常是32位(视平台而定)
long d;//32位或64位(视平台而定)
long long e;//64位
然后,我看到了后面的一段示例代码:
#include <stdio.h>
int main (int argc, const char * argv[])
{
int x = 255;
printf("x is %d.\n", x);
return 0;
}
输出结果为:
x is 255.
但,我突发奇想,想试验一下其他的整数声明,我就把int x = 254改成了char x = 254
结果,输出结果为:
x is -2.
这个结果太出乎我意外了(新人,但皮厚,可随便取笑。),char不是8位么?应该可以保存
0-255之间的整数啊,为什么等于254,输出为-2(还蛮有规律的,如果是255,就是-1)了啊?
或者说,我的理解一直有误,虽然8位的无符号整数可保存0-255之间的整数,但这个保存0-255之间的整数,并不是我现在认为的可以char x = 254?
精壮的大神们,请帮帮我吧,虽然对你们来讲是常识问题,但我扒拉了好久google也没有弄明白啊,倒是越来越糊涂,我还找了本C的教程来看整数这一段,也是没明白。
精壮的大神们,来吧~
8位的unsigned 范围是0~255
8位的signed 范围是-128~127
那么怎么表示负数呢? 我们希望unsigned能用和signed一样的规则做加减法。所以负数的表示满足-x = ~x + 1这个公式(~x表示x取补),也就是8位的情况下 0xFF 表示 -1 ,0xFE表示-2,254也就是0xFE
想想看在8位的情况下
254 + 2 == 0; //溢出
-2 + 2 == 0;
signed和unsigned用的加减法实现是一致的
写到这里想起来了,C好像是%d => signed %ud之类 => unsigned 来着?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。