世界。 我是 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
我的问题:
关于6-a和7-a,在12前面加0如何需要unsigned int在16位int系统中拥有更多的正空间? 12 是二进制的 1100。 012 在数学上是相同的,但在计算上有不同吗?
关于6-b和7-g,十六进制格式为什么有unsigned int? 0X3和0x44分别是二进制的11和1000100,十进制的3和68。 16 位整数的可能值范围为 -32,768 到 32,767,但答案中两者都是无符号整数。
关于6-d,我在书上看到,C标准规定 float 必须能够表示至少六位有效数字。这里 2.34E07 有更多,所以双倍。而且从书中还可以看出,默认情况下,编译器假定浮点常量是 double 的。这个默认规则仅适用于常量吗?分配变量时需要具体吗?
关于6-f,7.0怎么会加倍?是因为编译器假设浮点常量是 double 的吗?对于变量我应该使用 float 像 float f = 7.0; ?
关于7-d,是否是long类型(保证32位)有更多的空间容纳100,000?但我们必须假设 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 类型。要强制其类型为 float ,请确保附加
f
后缀(例如3.14f
)。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/