【发布时间】:2013-09-05 18:36:40
【问题描述】:
既然
sizeof是一个操作符,为什么我们可以像函数调用一样使用sizeof(something);呢?字节何时不是 8 位?
此上下文中的字节与无符号字符相同,并且可能大于 8 位
字节是否有可能小于 8 位?
【问题讨论】:
-
C90,§5.2.4.2.1 需要 CHAR_BIT >= 8
既然sizeof是一个操作符,为什么我们可以像函数调用一样使用sizeof(something);呢?
字节何时不是 8 位?
此上下文中的字节与无符号字符相同,并且可能大于 8 位
字节是否有可能小于 8 位?
【问题讨论】:
既然 sizeof 是一个操作符,为什么我们可以使用 sizof(something);像函数调用?
好吧,+ 也是一个“操作员”(原文如此!),您仍然可以编写 (1 + 1) 和 (1) + (1) 和 ((1) + 1)... 这只是正常的括号/分组。
当字节不是8位时?
当您使用的平台不是 8 位时。
字节是否有可能小于 8 位?
不适用于旨在成为符合 C 实现的架构。不过,它可能会发生。例如,一些早期的打卡机使用 6 位字节。
【讨论】:
像大多数运算符一样,sizeof 可以应用于可以包含括号的表达式。就解析器而言,它与x * (b + c) 几乎相同,其中* 适用于(b + c)。虽然你不经常看到它,但像 x + (b) 这样的东西也是完全可能的。
标准规定CHAR_MIN 不得高于-127,CHAR_MAX 必须至少为 127。这需要至少 8 位来表示,所以不,char 不能小于 8 位.
【讨论】:
char 大于 8 位与字符编码无关。它与无法寻址或在 8 位单元上运行的机器有关——通常是只有单一大小的内存访问单元的 DSP,通常是 32 位或 64 位。
CHAR_BIT==8 来支持所有现有的二进制数据文件、网络协议等。文本只是问题的一小部分。
既然 sizeof 是一个操作符,为什么我们可以使用 sizof(something);像函数调用?
其他人回答了这个问题,但我还是会回答。 ~ 是一个运算符,那为什么我们可以用~(a) 而不是~a 呢?虽然根本不同,但它们在语法方面仍然相似。例外是你可以做sizeof(int),但这是因为sizeof 做了什么,它被扩展为一个编译时常量。
当字节不是 8 位时?
此上下文中的字节与无符号字符相同,可能大于 8 位
某些平台有 9 位字节。 C 标准要求每个字符至少 8 位。目前,许多系统使用 8 位字节,也就是“八位字节”。
在像 Java 这样的语言中,char 不是 8 位的,因此 C 的实现可以用同样的方式轻松定义它。如果没有位掩码和位移位或位字段,您将无法使用标准 C 语法访问更少量的数据,因为像 short int 这样的其他数据类型是根据 char 定义的:
存储在任何其他对象类型的非位域对象中的值由 n × CHAR_BIT 位组成,其中 n 是大小该类型的对象,以字节为单位。
所以如果sizeof(short int) 是2,它将有2 × CHAR_BIT 位。如果 CHAR_BIT 是 16,则 short int 是 32 位整数类型。
【讨论】:
计算机科学对字节的定义有所不同。这是8位。而 C 的定义是 byte 是 char 类型的位数。由于几乎总是相同的,因此它们被视为平等是很常见的。
【讨论】:
【讨论】:
sizeof 没有“取类型”。它需要一个表达式,看起来像一个演员表。但最好在对象上使用sizeof,比如int *nums = malloc(3 * sizeof *nums);等。
sizeof(int)的时候,sizeof的参数不就是一个类型吗?还是实际上是sizeof <the big nothing cast to int>?