有关详细信息,我从一本书中学习(以艰难的方式学习C),我有一个练习,他告诉我学习一些类型的大小,但我没有太多的细节,我不知道#39;非常清楚什么是无符号和有符号整数以及你在哪里使用它。我只是一个想法:未签名没有负数,签名可以有负数,但外部世界,无法达到与无符号一样高的自然数。 那还有吗?
本书包含一些命令 uint_least(N)_t,INT_LEAST(N)_MAX,INT_LEAST(N)_MIN,UINT_LEAST(N)_MAX,int_fast(N)_t,uint_fast(N)_t 但我不明白我能用他们做些什么。
请告诉我他们用的是什么?当我用这个?是一个像 Int或if?的命令,或者你在像 i<这样的循环中使用它unit_fast8_t; i ++ ?
P.S。我的英语很糟糕,我知道:(我很难理解一些术语。
答案 0 :(得分:0)
假设我们int
只有3位可用。当你决定不这样做时
需要负值,你有2^3 = 8
个可能的值(包括零)
可以存储在3位int
:
000 -> 0
001 -> 1
010 -> 2
011 -> 3
100 -> 4
101 -> 5
110 -> 6
111 -> 7
这将是 unsigned int 所以当你知道你不需要否定时 值,例如你想用它来计算一些循环:
for (int_3bit i = 0; i < 6; i++) {
printf("Hello world!\n");
}
这里使用无符号值非常好,因为没有负值
永远在i
变量内。如果你添加1到7,你将再次获得0,如果
你从0减1,你会得到7。
但是当确实需要负值时,您必须使用有符号整数。
然后我们必须拟合关于值的符号 AND 的信息
值为我们可用的3位。这可以通过多种方式完成,但是要做到
保持简单,我们可以使用最左边的位作为符号指示器。当它的时候
零,数字是正数,当它是1时,数字是负数。这个
只留下2位的值,现在只能保存2^2 = 4
个值:
000 -> 0
001 -> 1
010 -> 2
011 -> 3
101 -> -1
110 -> -2
111 -> -3
这不是很好的签名int表示,通常是其他东西 用过的 (见http://en.wikipedia.org/wiki/Signed_number_representations),但它显示了 你在有符号和无符号整数之间有一些基本的区别:
无符号整数适合计算,但不适合算术。
有符号整数适用于算术,但用作计数器时,它们 可以只计算无符号整数范围的一半(因为一位是 “浪费”举着牌子。)