c - C Primer Plus 6th 中的 C 语言数据类型

标签 c variables floating-point int constants

世界。 我是 CS 方面的新手,正在通过《C Primer Plus》一书学习 C。 第三章末尾有一些复习题,我对他们的一些答案感到困惑。 我想通过我对它们的理解来澄清。请纠正我并分享一些您的知识。

这是下面这本书中的问题,然后是我的问题。

6. Identify the data type (as used in declaration statements) and the printf() format specifier for each of the following constants:
     Constant       Type          Specifier
-a.    12           int              %d
-b.    0X3       unsigned int        %#x
...
-d.   2.34E07      double            %e
-e.   '\040'      char(rlly int)     %c
-f.    7.0         double            %f
...

7. the same as the question 6 but assume a 16-bit int:
     Constant       Type          Specifier
-a.    012       unsigned int        %#o
...
-d.   100000        long             %ld
...
-g.    0x44      unsigned int        %d

我的问题:

  1. 关于6-a和7-a,在12前面加0如何需要unsigned int在16位int系统中拥有更多的正空间? 12 是二进制的 1100。 012 在数学上是相同的,但在计算上有不同吗?

  2. 关于6-b和7-g,十六进制格式为什么有unsigned int? 0X3和0x44分别是二进制的11和1000100,十进制的3和68。 16 位整数的可能值范围为 -32,768 到 32,767,但答案中两者都是无符号整数。

  3. 关于6-d,我在书上看到,C标准规定 float 必须能够表示至少六位有效数字。这里 2.34E07 有更多,所以双倍。而且从书中还可以看出,默认情况下,编译器假定浮点常量是 double 的。这个默认规则仅适用于常量吗?分配变量时需要具体吗?

  4. 关于6-f,7.0怎么会加倍?是因为编译器假设浮点常量是 double 的吗?对于变量我应该使用 float 像 float f = 7.0; ?

  5. 关于7-d,是否是long类型(保证32位)有更多的空间容纳100,000?但我们必须假设 16 位 int 系统,其无符号表示形式介于 0 到 65,535 之间。拥有 16 位 int 系统的计算机如何处理超出其能力的处理?

请随意撕裂我,打破我对 C 语言数据类型的理解并教导我。

最佳答案

  1. 除了二进制之外,计算机科学中使用最广泛的两种基数是八进制十六进制。在大多数编程语言(包括 C)中,它们在整数文字中各自的前缀是 0b (注意,虽然 gcc 和 clang 在某些条件下支持它,但这不是 C 中的官方前缀,可能无法与其他编译器)、00x。 对于 printf,主题标签标志 (#) 的用途之一是指定前缀:对于 7-a,#o 指定八进制基本前缀。

  2. 这是 C 中的默认行为,x 或 X 说明符引用无符号的十六进制整数。

  3. 初始化或分配变量时,最好始终添加 f 后缀。如果你写float f = 0.15466789797554,你可能会因为double rounding而收到错误。 。编译器首先将预期的浮点常量舍入为 double,然后将其舍入为 float 进行赋值。

  4. 在 C 中,编译器假定没有后缀的浮点常量为 double 类型。要强制其类型为 float ,请确保附加 f 后缀(例如 3.14f)。

  5. C 标准指定 long 修饰符向数据类型的宽度添加 2 个字节。正如您所提到的,使用不带修饰符的 unsigned int 数据类型不允许我们为其指定值 100,000。添加 long 修饰符使我们的长度从 16 位(2 个字节)变为 32 位(4 个字节),因此我们可以从 32,767 到 2,147,483,647 作为有符号 int 的最大值,从 65,535 到 4,284,867,295 作为最大值对于无符号整数。 在字大小为 16 位(2 字节)的处理器上,编译器将 long 分为上半部分和下半部分。然后它将两者存储在不同的寄存器中。

关于c - C Primer Plus 6th 中的 C 语言数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237269/

相关文章:

c - 高效地打印多个变量的值

c++ - 定义指针变量

c++ - 双变量作为循环计数器

python - 代码在将 0.0 转换为 0 时有效,但在 1.0 转换时失败?

c - 模拟中的 stub 函数

c - 使用 openssl 进行数据加密/解密

c - 在多个 .h 文件中使用 typedef 结构

ios - 变量/常量声明差异

javascript - 动态创建的js脚本onClick函数变量未绑定(bind)在当前值

floating-point - 添加 32 位 float 。