【发布时间】:2011-04-07 08:15:27
【问题描述】:
为什么我们在 C 中使用整数?
#include<stdio.h>
int main()
{
char c=10;
printf("%d",c);
return 0;
}
等同于:
#include<stdio.h>
int main()
{
int c=10;
printf("%d",c);
return 0;
}
【问题讨论】:
为什么我们在 C 中使用整数?
#include<stdio.h>
int main()
{
char c=10;
printf("%d",c);
return 0;
}
等同于:
#include<stdio.h>
int main()
{
int c=10;
printf("%d",c);
return 0;
}
【问题讨论】:
从机器架构的角度来看,char 是一个可以用 8 位表示的值(非 8 位架构发生了什么?)。
int 中的位数不固定;我相信它被定义为特定机器的“自然”值,即该机器最容易/最快操作的位数。
如前所述,计算机中的所有值都存储为二进制位序列。这些位的解释方式各不相同。它们可以被解释为二进制数或代表其他东西的代码,例如一组字母字符,或许多其他可能性。
最初设计 C 时,假设 256 个代码足以表示字母表中的所有字符。 (实际上,这可能不是假设,但在当时已经足够好了,设计者试图保持语言简单并与当时的机器架构相匹配)。因此 8 位值(256 种可能性)被认为足以容纳字母字符代码,并且 char 数据类型被定义为方便
免责声明:上面写的都是我的意见或猜测。只有 C 的设计者才能真正回答这个问题。
一个更简单但具有误导性的答案是,您不能将整数值 257 存储在 char 中,但可以存储在 int 中。 自然的
【讨论】:
char cant 可以容纳整数。不是一切。
至少不会以您将值分配给char 的方式。
对sizeof 做一些试验,看看char 和int 之间是否有区别。
如果您真的希望使用char 而不是int,您可能应该考虑使用char[],并存储以 10 为基数的 ASCII 字符表示形式的数字。 :-)
【讨论】:
从技术上讲,所有数据类型都用 0 和 1 表示。那么,如果它们在后端都相同,为什么我们需要不同的类型呢?
嗯,类型是数据的组合,以及您可以对数据执行的操作。
我们有ints 代表数字。他们有类似+ 的运算来计算两个数字的和,或者- 来计算差值。
当您想到一个字符时,在通常意义上,它代表人类可读格式的一个字母或符号。能够对'A' + 'h' 求和是没有意义的。 (尽管 c 允许你这样做。)
因此,我们有不同语言的不同类型,以使编程更容易。它们本质上封装了数据以及对其合法执行的功能/操作。
Wikipedia 有一篇关于类型系统的好文章。
【讨论】:
从广义上讲,char 是机器上最小的敏感数据存储单元,但 int 是正常计算的“最佳”大小(例如,寄存器的大小) )。任何数据类型的大小都可以表示为chars 的数量,但不一定是ints 的数量。例如,在 Microchip 的 PIC16 上,char 是 8 位,int 是 16 位,short long 是 24 位。 (short long 必须是我遇到过的最愚蠢的类型限定符。)
请注意,char不一定必须是 8 位,但通常是。推论:任何时候有人声称它是 8 位,有人会插话并命名一台机器,而它不是。
【讨论】:
int 不是计算的“最佳”大小(不再),但只是最不合理的。这就是为什么+ 等的所有操作数在宽度较小时首先提升为int,我认为。在现代 64 位架构上,“最佳”大小主要是 64 位类型,而 int 仍保持在 32 位。这被 Al 在他的回答中提到的 int_fastN_t 类型捕获。不,我不会评论 8 位问题 ;-)
ints ... 生活和学习 :)
因为
#include <stdio.h>
int main(int argc, char **argv)
{
char c = 42424242;
printf("%d", c); /* Oops. */
return(0);
}
【讨论】:
int 的范围,但在任何健全的平台上都安全地在int 的大小范围内。
试试这个:
#include <stdio.h>
int main()
{
int c = 300;
printf("%d", c);
return 0;
}
#include <stdio.h>
int main()
{
char c = 300;
printf("%d", c);
return 0;
}
数据类型char、short、int、long 和long long 包含(可能)不同大小的整数,这些整数可以取值达到特定限制。 char 包含一个 8 位数字(从技术上讲,它既不是 signed 也不是 unsigned,但实际上是其中之一)。因此范围只有 256(-127 到 128 或 0 到 255)。
良好的做法是避免使用char、short、int、long 和long long 并使用int8_t、int16_t、int32_t、uint8_t 等,甚至更好: int_fast8_t、int_least8_t等
【讨论】:
char、short、int、long 和 long long 都有保证的最小范围,这在大多数情况下是您需要的(主要例外是当您处理指定的二进制接口时,例如二进制文件或网络协议)。不保证提供精确宽度类型。
int_fast8_t、int_least8_t 等,并保证它们是至少 8 位的最快和最小(分别)可能的整数。其他尺寸也是如此。
int_least8_t,保证为signed char。那么为什么不直接使用signed char?
signed char 来说是公平的,但对于 16 位和 32 位整数来说没有那么有用。 int_least8_t 然后具有与使用(例如)uint_fast16_t 的其余代码保持一致的优势。
一个字符只能保留 8 位,而整数可以有 16、32 甚至 64 位(long long int)。
【讨论】:
因为char 只保存 -127 到 127 之间的数字
【讨论】:
char 是特殊的 - 它可以是有符号的或无符号的(实际上是与 signed char 和 unsigned char 不同的类型)。