类型大小,Stind.h,有符号和无符号整数

时间:2014-07-29 11:38:58

标签: c

有关详细信息,我从一本书中学习(以艰难的方式学习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。我的英语很糟糕,我知道:(我很难理解一些术语。

1 个答案:

答案 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),但它显示了 你在有符号和无符号整数之间有一些基本的区别:

无符号整数适合计算,但不适合算术。

有符号整数适用于算术,但用作计数器时,它们 可以只计算无符号整数范围的一半(因为一位是 “浪费”举着牌子。)