C Primer Plus 6th 中的 C 语言数据类型
Data Types in C from C Primer Plus 6th
世界。
我是 CS 的新手,正在学习 C 语言 'C Primer Plus'。
第 3 章末尾有复习题,我对他们的一些答案感到困惑。
我想通过我对他们的理解来澄清一下。请指正我并分享一些你的知识。
下面是书中的问题,然后是我的问题。
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. '0' 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
我的问题:
关于6-a & 7-a,在16位的int系统中,12前面加0怎么需要unsigned int才能有更多的正数space? 12 在二进制中是 1100。 012在数学上是一样的,但在计算上有什么不同吗?
关于6-b&7-g,十六进制格式怎么会有unsigned int? 0X3和0x44二进制分别为11和1000100,十进制为3和68。一个 16 位整数的可能取值范围是 −32,768 到 32,767,但答案中都是 unsigned int。
关于6-d,我在书上看到C标准规定浮点数至少要能表示6位有效数字。这里 2.34E07 有更多,所以加倍。而且从书中也可以看出,默认情况下,编译器假定浮点常量是双精度的。这个默认规则只适用于常量吗?分配变量时需要具体吗?
关于6-f,7.0怎么加倍?是因为编译器假定浮点常量是双精度的吗?对于变量,我应该使用 float like float f = 7.0; ?
关于7-d,long类型(保证32位)多space10万是不是?但我们必须假设 16 位 int 系统,它在无符号表示中介于 0 和 65,535 之间。具有 16 位 int 系统的计算机如何处理超出其能力的处理能力?
请随意拆散我,打破我对 C 中数据类型的理解并教我。
计算机科学中使用最广泛的两个基数,除了二进制,还有八进制和十六进制。在大多数编程语言中,包括 C,它们各自的整数字面量前缀是 0b
(注意,虽然 gcc 和 clang 在某些情况下支持它,但这不是 C 中的官方前缀,可能不适用于其他编译器) , 0
和 0x
。
在 printf
的情况下,主题标签标志 (#) 的用途之一是指定前缀:在 7-a 的情况下,#o
指定八进制基数前缀。
这是 C 中的默认行为,x 或 X 说明符指的是无符号十六进制整数。
初始化或分配变量时,最好始终添加 f 后缀。如果你写 float f = 0.15466789797554
,你可能会因为 double rounding 而出错。编译器首先将预期的浮点常量舍入为 double
,然后将其舍入为 float
以进行赋值。
在 C 中,编译器假定没有后缀的浮点常量是 double 类型。要将其类型强制为浮点数,请确保附加 f
后缀(例如 3.14f
)。
C 标准指定 long
修饰符将数据类型的宽度增加 2 个字节。如您所述,使用不带修饰符的 unsigned int
数据类型不会让我们给它赋值 100,000。添加 long
修饰符需要我们从 16 位(2 字节)到 32 位(4 字节),所以我们从 32,767 到 2,147,483,647 作为有符号整数的最大值,从 65,535 到 4,284,867,295 作为无符号整数的最大值诠释。
在字长为 16 位(2 字节)的处理器上,编译器将 long 分为上半部分和下半部分。然后它将两者存储在单独的寄存器中。
世界。 我是 CS 的新手,正在学习 C 语言 'C Primer Plus'。 第 3 章末尾有复习题,我对他们的一些答案感到困惑。 我想通过我对他们的理解来澄清一下。请指正我并分享一些你的知识。
下面是书中的问题,然后是我的问题。
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. '0' 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
我的问题:
关于6-a & 7-a,在16位的int系统中,12前面加0怎么需要unsigned int才能有更多的正数space? 12 在二进制中是 1100。 012在数学上是一样的,但在计算上有什么不同吗?
关于6-b&7-g,十六进制格式怎么会有unsigned int? 0X3和0x44二进制分别为11和1000100,十进制为3和68。一个 16 位整数的可能取值范围是 −32,768 到 32,767,但答案中都是 unsigned int。
关于6-d,我在书上看到C标准规定浮点数至少要能表示6位有效数字。这里 2.34E07 有更多,所以加倍。而且从书中也可以看出,默认情况下,编译器假定浮点常量是双精度的。这个默认规则只适用于常量吗?分配变量时需要具体吗?
关于6-f,7.0怎么加倍?是因为编译器假定浮点常量是双精度的吗?对于变量,我应该使用 float like float f = 7.0; ?
关于7-d,long类型(保证32位)多space10万是不是?但我们必须假设 16 位 int 系统,它在无符号表示中介于 0 和 65,535 之间。具有 16 位 int 系统的计算机如何处理超出其能力的处理能力?
请随意拆散我,打破我对 C 中数据类型的理解并教我。
计算机科学中使用最广泛的两个基数,除了二进制,还有八进制和十六进制。在大多数编程语言中,包括 C,它们各自的整数字面量前缀是
0b
(注意,虽然 gcc 和 clang 在某些情况下支持它,但这不是 C 中的官方前缀,可能不适用于其他编译器) ,0
和0x
。 在printf
的情况下,主题标签标志 (#) 的用途之一是指定前缀:在 7-a 的情况下,#o
指定八进制基数前缀。这是 C 中的默认行为,x 或 X 说明符指的是无符号十六进制整数。
初始化或分配变量时,最好始终添加 f 后缀。如果你写
float f = 0.15466789797554
,你可能会因为 double rounding 而出错。编译器首先将预期的浮点常量舍入为double
,然后将其舍入为float
以进行赋值。在 C 中,编译器假定没有后缀的浮点常量是 double 类型。要将其类型强制为浮点数,请确保附加
f
后缀(例如3.14f
)。C 标准指定
long
修饰符将数据类型的宽度增加 2 个字节。如您所述,使用不带修饰符的unsigned int
数据类型不会让我们给它赋值 100,000。添加long
修饰符需要我们从 16 位(2 字节)到 32 位(4 字节),所以我们从 32,767 到 2,147,483,647 作为有符号整数的最大值,从 65,535 到 4,284,867,295 作为无符号整数的最大值诠释。 在字长为 16 位(2 字节)的处理器上,编译器将 long 分为上半部分和下半部分。然后它将两者存储在单独的寄存器中。