好的,实际上,我已经研究了如何使用循环来提高代码的效率,这样我就可以使用一个应该重复的特定代码块,而不必一遍又一遍地输入它。在尝试使用到目前为止已经学到的东西来编写程序之后,我觉得是时候开始下一章学习如何使用控制语句来学习如何指导程序做出决定了。
但问题是,在我开始之前,我还有几个问题需要专家的帮助。实际上是关于数据类型的。
A.字符类型
”一书中提取以下内容
有点奇怪,C将字符constans视为类型
int而不是char。例如,在具有32位int和8位char的ASCII系统上,代码:
char等级= 'B';
将'B'表示为存储在32位单元中的数值66,grade与存储的ub 8位单元一起结束。字符常量的这一特性使定义字符常量(如'FATE' )成为可能,并将四个单独的8位ASCII代码存储在32位单元中。但是,试图将这样的字符常量赋值给char变量只会导致使用最后8位,因此变量将获得值'E'。
我看完后做的下一件事当然是,跟着它提到的,我试着用'F'.
FATE存储在一个变量上,然后试着编译并查看它将使用printf()存储的内容,但是没有打印字符'E',我得到的是FATE--这意味着书中有一些错误?或者有什么东西我misunderstood?
int类型。因此,为了尝试一下,我分配了一个比255大的数字,(e.x )。356)到char类型。由于356在32位int的范围内(我正在运行356 7),所以当我使用%d 356而不是打印356时,它会打印出356,它给了我100,这是最后的8位值。H 242H 143为什么会发生这种情况?我以为char == int == 32-bits?(虽然前面提到过char只是一个字节)。B. Int型和浮动型
short类型中的数字传递给变量函数或任何隐式原型函数时,它将自动提升为int类型。float类型的浮点数时,它将被转换为double类型,这就是为什么float类型没有说明符,但是只有%f表示double,%Lf用于%Lf,为什么short类型有说明符,尽管它也是提升的,但没有float类型?为什么他们不为float类型提供一个说明符,其中包含一个修饰符,比如%hf之类的呢?这背后有什么逻辑或技术吗?发布于 2011-05-15 18:46:17
一个问题中有很多问题..。以下是一对夫妇的答案:
字符常量的这一特性使定义字符常量(如“命运”)成为可能,将四个单独的8位ASCII代码存储在32位unit.However中,试图将这样的字符常量赋值给字符变量,结果只使用最后8位,因此变量得到'E‘值。
这实际上是实现定义的行为。所以是的,书上有个错误。许多关于C的书都假定世界上唯一的C编译器是作者在测试示例时使用的编译器。
作者使用的编译器将“命运”中的字符视为整数的字节,其中'F‘是最重要的字节,'E’是最小的字节。编译器将文字中的字符视为整数的字节,其中'F‘是最不重要的字节,'E’是最重要的字节。例如,第一种方法是MSVC如何处理该值,而MinGW (针对Windows的GCC编译器)则以第二种方式处理文本。
至于printf()没有期望float的格式说明符,对于期望double的说明符,这是因为传递给printf()进行格式化的值是变量参数列表( printf()'s prototype中的... )的一部分。没有关于这些参数的类型信息,所以正如您所提到的,编译器必须始终促进它们(来自C99 6.5.2.2/6“函数调用”):
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有浮点类型的参数提升为双值。这些被称为默认的参数提升。
和C99 6.5.2.2/7“函数调用”
函数原型声明器中的省略符号
导致在上次声明参数之后停止参数类型转换。默认的参数提升是对尾随参数执行的。
因此,实际上,不可能将float传递给printf() --它将始终被提升为double。这就是浮点值的格式说明符需要一个double的原因。
另外,由于将应用于short的自动升级,我实在不确定格式化short的h说明符是否是严格必要的(尽管如果您想要获得写入放置在short中的流的字符数,则与n说明符一起使用是必要的)。它可能在C中,因为它需要支持n说明符、历史原因,或者一些我没有想到的东西。
发布于 2011-05-15 14:18:34
首先,根据定义,char的宽度正好为1字节。那么,标准或多或少地说,尺寸应该是:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)系统和编译器的确切大小不同(char除外),但在32位Windows上,GCC和VC的大小为(AFAIK):
sizeof(short) == 2 (byte)
sizeof(int) == sizeof(long) == 4 (byte)在这种情况下,您对'F‘和'E’的观察是一个典型的endianness问题(小对大端,“单词”是如何存储在内存中的)。
现在你的价值会怎么样?你有一个8位宽的变量。您可以分配一个更大的值('FATE'或356),但是编译器知道它只允许存储8位,因此它切断了所有其他位。
发布于 2011-05-15 14:17:39
至A: 3.)这是由于大小端CPU结构的字节顺序不同造成的。您可以在小端点(即x86)上得到第一个字节,在大端CPU (即PPC)上得到最后一个字节。实际上,当从int到char的转换完成时,您总是得到最低的8位,但是int中的字符却以相反的顺序存储。
7.)一个字符只能容纳8位,因此当您将int分配给char变量时,其他所有内容都会被截断,以后再也不能从char变量中恢复。
至B: 3.)有时,您可能希望只打印int变量中最低的16位,而不管上半部分是什么。将多个整数值打包到单个变量中进行某些优化并不少见。这对于整数类型很好,但是对于不直接支持按位操作的浮点类型来说,这可能是printf中没有单独的浮点类型说明符的原因。
https://stackoverflow.com/questions/6008813
复制相似问题