C“ int”的大小是2个字节还是4个字节? 您所在的位置:网站首页 占用字节数是什么意思啊 C“ int”的大小是2个字节还是4个字节?

C“ int”的大小是2个字节还是4个字节?

2024-05-23 08:45| 来源: 网络整理| 查看: 265

C中的Integer变量占用2个字节还是4个字节? 它取决于哪些因素?

大多数教科书都说整数变量占用2个字节。 但是,当我运行一个程序打印整数数组的连续地址时,它显示出4的差。

相关讨论 en.wikipedia.org/wiki/ int只是几种整数类型之一。 您询问"整数"的大小; 您可能想问一下int的大小。 而且您应该找到更好的教科书。 一本教科书上说int是2个字节,(a)可能是指旧系统,而(b)未能清楚说明大小会因一个系统而异。 关于C的最佳书籍是Kernighan和Ritchie撰写的" The C Programming Language",尽管它具有一定的编程经验。 另请参阅comp.lang.c FAQ的问题18.10。 在64位平台上尝试#define int int64_t,但不要尝试。 只需使用sizeof。;-) C ++标准声明int,long类型的大小是什么的可能重复项?

我知道它等于sizeof(int)。 int的大小实际上取决于编译器。过去,当处理器为16位时,int为2字节。如今,在32位和64位系统上,通常为4字节。

尽管如此,对于在其上执行程序的特定系统,使用sizeof(int)是获取整数大小的最佳方法。

编辑:修复了大多数64位系统上int为8字节的错误声明。例如,在64位GCC上为4字节。

相关讨论 @RajivPrathap:好吧,它依赖于编译器,但是编译器决定它是否也依赖于机器。 :) 如果需要预处理程序的大小,则可以检查预定义的宏,例如INT_MAX。如果该值不是您的代码期望的值,则int的字节大小在当前编译器/平台组合上会有所不同。 不仅取决于机器,还取决于机器上运行的操作系统。例如,在Win64中long是4个字节,而在Linux64中long是8个字节。 错误。在大多数64位系统上,int仍然为4个字节。en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models 我的系统是64位,int的大小是4B。为什么会这样呢? @AkhilNadhPC有关于此的论文。有人打赌,人们认为32位就足够了,使用32而不是64可以进行SSE等优化。 sizeof(int)可以是1中的任何值。一个字节不需要是8位,并且某些机器没有8位可寻址单元(这基本上是标准中字节的定义)。没有更多信息,答案是不正确的。 我第二个@toohonestforthissite。不建议使用sizeof(int),因为单独使用它不能真正传达有用的信息。问题是sizeof确定其操作数中有多少字节,但没有告诉您一个字节中有多少位。为此,您需要乘以CHAR_BIT。可能还有填充位,这意味着您的" 32位整数"可能只能存储16位值。我认为您要写的是"使用INT_MIN和INT_MAX是获取所需信息的最佳方法,而不是sizeof""。 Ive在嵌入式系统上工作了10多年。我从来没有遇到过一个半字节可寻址单元或字节/半字节系统。是的,您可以使内容跨半字节等移动,并且最多占用28位等,但是您仍在秘密存储32个字节,因此sizeof(int)== 4对于动态内存分配(即malloc)更有用。这实际上取决于您要回答什么问题。

这是C语言中一开始可能会造成混淆的要点之一,但是C标准仅指定了保证可以支持的整数类型的最小范围。 int保证能够容纳-32767到32767,这需要16位。在这种情况下,int是2个字节。但是,实现可以随意超出该最小值,因为您会看到许多现代编译器将int设置为32位(这也意味着4字节无处不在)。

您的书说2个字节的原因很可能是因为它太旧了。曾经这是常态。通常,如果需要找出正在使用的平台上的字节数,则应始终使用sizeof运算符。

为了解决这个问题,C99添加了新的类型,您可以在其中明确要求特定大小的整数,例如int16_t或int32_t。在此之前,没有通用的方法来获取特定宽度的整数(尽管大多数平台在每个平台上都提供相似的类型)。

相关讨论 为int16_t和int32_t +1 那不是-32768吗? @nevanking:在二进制补码机上(这是我所知道的每台机器...),是的。但是,C不能保证确实如此。 @nevanking Im对C来说是全新的,但不是32767,因为否则它将使用另一位字节吗?想象一下,我可以保留3位数字(0或1),所以我可以从000到111(十进制为7)。 7在2的指数之前。如果我可以一直到8(1000),那么我可以一直使用这4位数字直到15! 32767等恰好在指数2之前,用尽了所有可用的字节。 @RSerrao Im也不是C专家,但是AFAIK的正数比最大负数小1。所以-8到7,-256到255,依此类推。负数不必算零。 @nevanking你是对的! O.o我忘记了负数,当我写评论时,在中间的某个地方,我忘了您指出了负数:D您当然可以确定!最重要的是,它甚至很有道理! " 16位。在这种情况下,int为2个字节"可能是错误的,如果CHAR_BIT为16,则sizeof(int)可以为1个字节(或char)。 @nevanking:仅当您假设带符号的int为2s补码表示形式时。 C没有做这个假设。 1s补码和符号幅度系统不能以16位表示-32768;相反,它们有两个零表示(正数和负数)。这就是为什么int的最小范围是[-32767..32767]的原因。 还值得注意的是,在某些实现中,补码表示中使用-0,因为从技术上来说,访问负零是UB,您会得到一个额外的值,例如,对于int,该值是-INT_MIN + 1。在频谱的正端得到额外的值...好吧,该手册说" CONFORMANCE / TWOSARITH导致负零(236)-1,根据生成的代码被认为是一个大的无符号整数",尽管我真的认为它们的含义是互补或符号和大小,否则它们的实现可能不符合要求。如今的编译器开发者? :/

没有具体答案。这取决于平台。它是实现定义的。它可以是2、4或其他。

int背后的想法是,它应该与给定平台上的自然"字"大小匹配:在16位平台上为16位,在32位平台上为32位,在64位平台上为64位这个想法。但是,出于向后兼容的目的,某些编译器甚至在64位平台上也倾向于使用32位int。

除非您正在使用某些16位字长的嵌入式平台,否则2字节int的时间已经过去了(16位平台?)。您的教科书可能很旧。

相关讨论 The idea behind int was that it was supposed to match the natural"word" size on the given platform-这就是我想要的。知道原因可能是什么?在自由世界中,int可以在内存中占据任意数量的连续字节吗? 8、16

该问题的答案取决于您使用的平台。 但是无论平台如何,都可以可靠地假定以下类型:

12345678 [8-bit] signed char: -127 to 127  [8-bit] unsigned char: 0 to 255  [16-bit]signed short: -32767 to 32767  [16-bit]unsigned short: 0 to 65535  [32-bit]signed long: -2147483647 to 2147483647  [32-bit]unsigned long: 0 to 4294967295  [64-bit]signed long long: -9223372036854775807 to 9223372036854775807  [64-bit]unsigned long long: 0 to 18446744073709551615 相关讨论 有人编辑了您的信息以"修正"范围,但是我不确定您的编辑是否充分反映了您的意图。它假设采用二进制补码实现,这在大多数情况下是正确的,但不是全部。由于您的答案特别指出了实现依赖关系,因此我认为编辑可能是错误的。如果您同意,请确保恢复编辑。 @ k06a您的编辑不正确。您已将原始范围专门更改为2补码范围-这些不是C标准中指定的范围。 @CodyGray这一直来回波动,在过去的3年中一直兼容1s补码,OP没说什么,所以我还原了将其更改为2s补码的"修正范围",因为它说"您可以可靠地假设" ,这仍然不完全正确。

Does an Integer variable in C occupy 2 bytes or 4 bytes?

Ok.

这取决于您使用的平台以及编译器的配置方式。唯一权威的答案是使用sizeof运算符来查看特定情况下整数的大小。

What are the factors that it depends on?

Ok.

最好考虑范围,而不是大小。两种方法在实践中都会有所不同,尽管我们会看到,按范围选择变量类型比选择大小要容易得多。还需要注意的是,该标准鼓励我们考虑基于范围而不是大小来选择整数类型,但是现在让我们忽略标准做法,并让我们好奇地探索sizeof,字节和CHAR_BIT以及整数表示形式...让我们钻进兔子洞,亲眼看看...

sizeof,字节和CHAR_BIT

以下声明取自C标准(链接至上文),以我认为无法改进的语言来描述。

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand.

Ok.

假设您有一个清晰的认识,将会导致我们对字节进行讨论。通常假设一个字节是八位,而实际上CHAR_BIT告诉您一个字节中有多少位。那只是在谈论常见的两个(或四个)字节整数时不考虑的细微差别中的另一个。

到目前为止,让我们总结一下:

sizeof =>大小(以字节为单位),以及 CHAR_BIT =>字节中的位数

因此,根据您的系统,sizeof (unsigned int)可以是大于零的任何值(不只是2或4),就像CHAR_BIT是16一样,则单个(十六位)字节中有足够的位数来表示标准描述的16位整数(如下所述)。那不一定是有用的信息,是吗?让我们深入研究...

整数表示

C标准在此为所有标准整数类型(以及CHAR_BIT,也称为fwiw)指定最小精度/范围。由此,我们可以得出存储该值所需的位数的最小值,但是我们也可以根据范围选择变量。但是,此答案所需的大部分细节都位于此处。例如,以下标准unsigned int需要(至少)十六位存储:

1UINT_MAX                                65535 // 21? - 1

因此,我们可以看到unsigned int需要(至少)16位,这是您获得两个字节的地方(假设CHAR_BIT为8)...后来,当该限制增加到232 - 1时,人们指出4字节代替。这解释了您观察到的现象:

Most of the textbooks say integer variables occupy 2 bytes. But when I run a program printing the successive addresses of an array of integers it shows the difference of 4.

Ok.

您使用的是古老的教科书和编译器,它在教您非便携式C语言;编写您的教科书的作者甚至可能都不知道CHAR_BIT。您应该升级教科书(和编译器),并努力记住它。这是一个不断发展的领域,您需要保持领先地位才能竞争。让我们看看这些底层整数字节还存储了其他哪些非便携式机密...

值位是常见的误解似乎正在计数的内容。上面的示例使用unsigned整数类型,该类型通常仅包含值位,因此很容易在细节上错过魔鬼。

符号位...在上面的示例中,我引用UINT_MAX作为unsigned int的上限,因为这是从注释中提取值16的简单示例。对于有符号类型,为了区分正值和负值(即符号),我们还需要包括符号位。

12INT_MIN                                -32768 // -(21?) INT_MAX                                +32767 // 21? - 1

填充位...虽然遇到整数填充位整数的计算机并不常见,但是C标准允许这种情况发生。某些机器(即该机器)通过将两个较小的(带符号的)整数值组合在一起来实现较大的整数类型...当您组合带符号的整数时,会浪费符号位。该浪费的位在C中被视为填充。填充位的其他示例可能包括奇偶校验位和陷阱位。

如您所见,在选择整数类型时,该标准似乎鼓励考虑诸如INT_MIN .. INT_MAX之类的范围以及该标准的其他最小/最大值,并且不鼓励依赖大小,因为还有可能遗忘其他细微的因素例如CHAR_BIT和填充位可能会影响sizeof (int)的值(即,对两字节和四字节整数的常见误解忽略了这些细节)。

好。

C99 N1256标准草案

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

int的大小和所有其他整数类型是实现定义的,C99仅指定:

最小尺寸保证 类型之间的相对大小

5.2.4.2.1"整数类型的大小"给出了最小大小:

1 [...] Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown [...]

UCHAR_MAX 255 // 2 8 ? 1 USHRT_MAX 65535 // 2 16 ? 1 UINT_MAX 65535 // 2 16 ? 1 ULONG_MAX 4294967295 // 2 32 ? 1 ULLONG_MAX 18446744073709551615 // 2 64 ? 1

6.2.5"类型"然后说:

8 For any two integer types with the same signedness and different integer conversion rank (see 6.3.1.1), the range of values of the type with smaller integer conversion rank is a subrange of the values of the other type.

6.3.1.1"布尔值,字符和整数"确定相对转换等级:

1 Every integer type has an integer conversion rank defined as follows:

The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than the rank of signed char. The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type, if any. For all integer types T1, T2, and T3, if T1 has greater rank than T2 and T2 has greater rank than T3, then T1 has greater rank than T3

唯一的保证是char必须至少为8位宽,short和int必须至少为16位宽,long必须至少为32位宽,并且sizeof (char) sizeof (short) sizeof (int) sizeof (long)(对于这些类型的未签名版本,这同样适用)。

int的宽度可能在16到64位之间,具体取决于平台。

大多数情况下,这取决于您使用的平台,它取决于编译器。如今,在大多数编译器中,int都是4字节。 如果要检查编译器在使用什么,可以使用sizeof(int)。

123456main() {     printf("%d",sizeof(int));     printf("%d",sizeof(short));     printf("%d",sizeof(long)); }

C编译器唯一保证的是short的大小必须等于或小于int,long的大小必须等于或大于int。因此,如果int的大小为4,则short的大小可能为2或4,但不能更大不仅如此,长期以来也是如此。它还说,短和长的大小不能相同。

相关讨论 将%d用于size_t参数是UB。

Is the size of C"int" 2 bytes or 4 bytes?

答案是"是" /"否" /"也许" /"也许不是"。

C编程语言指定以下内容:最小的可寻址单元(char已知,也称为"字节")恰好是CHAR_BIT位宽,其中CHAR_BIT至少为8。

因此,C中的一个字节不一定是八位字节,即8位。过去,最早的运行C代码(和Unix)的平台之一是4字节的int-但是int总共有36位,因为CHAR_BIT是9!

对于范围至少为-32767 ... 32767的平台,int应该是自然整数大小。您可以使用sizeof(int)在平台字节中获取int的大小;当将此值乘以CHAR_BIT时,您将知道它的位数。

尽管36位计算机大多数情况下都死定了,但仍有一些平台使用非8位字节。就在昨天,有关一个具有16位字节的Texas Instruments MCU的问题,该MCU具有C99,C11兼容编译器。

在TMS320C28x上,char,short和int似乎都是16位宽,因此一个字节。 long int是2个字节,long long int是4个字节。 C的美丽之处在于,人们仍然可以为这样的平台编写高效的程序,甚至可以以可移植的方式完成它!

这取决于实现,但通常取决于x86和其他流行的体系结构(如ARM int)占用4个字节。您始终可以在编译时使用sizeof(int)或要检查的任何其他类型进行检查。

如果要确保使用特定大小的类型,请使用中的类型

123456#include int main(void) {     printf("size of int: %d", (int)sizeof(int));     return 0; }

返回4,但可能与机器有关。

Is the size of C"int" 2 bytes or 4 bytes?

Does an Integer variable in C occupy 2 bytes or 4 bytes?

C允许"字节"不是每个"字节" 8位。

CHAR_BIT number of bits for smallest object that is not a bit-field (byte) C11dr §5.2.4.2.1 1

BLOCKQUOTE>

大于8的值越来越少见。为了获得最大的可移植性,请使用CHAR_BIT而不是8。C中以位为单位的int的大小为sizeof(int) * CHAR_BIT。

123#include printf("(int) Bit size %zu ", sizeof(int) * CHAR_BIT);

What are the factors that it depends on?

int位大小通常为32或16位。 C指定的最小范围:

minimum value for an object of type int INT_MIN -32767 maximum value for an object of type int INT_MAX +32767 C11dr §5.2.4.2.1 1

BLOCKQUOTE>

int的最小范围将强制位大小至少为16-即使处理器为" 8位"。在专用处理器中可以看到类似64位的大小。其他值(例如18、24、36等)已经出现在历史平台上,或者至少在理论上是可能的。现代编码很少担心非2的幂次幂int位的大小。

计算机的处理器和体系结构驱动int位大小的选择。

但是即使使用64位处理器,出于兼容性原因,编译器的int大小也可能是32位,因为大型代码库依赖于int是32位(或32/16)。

这是回答此问题的良好来源。

但是这个问题总是回答"是的,两者都是"。

这取决于您的体系结构。如果要在16位以下的计算机上工作,则不能为4字节(= 32位)。如果您使用的是32位或更高版本的计算机,则其长度为32位。

为了弄清楚,让您的程序准备好输出可读的内容并使用" sizeof"功能。这将返回声明的数据类型的大小(以字节为单位)。但是要对数组使用此技巧。

如果您声明int t[12];,它将返回12 * 4字节。要获取此数组的长度,只需使用sizeof(t)/sizeof(t[0])。 如果要构建一个函数,该函数应该计算发送数组的大小,请记住,如果

12345678910typedef int array[12]; int function(array t){     int size_of_t = sizeof(t)/sizeof(t[0]);     return size_of_t; } void main(){     array t = {1,1,1};  //remember: t= [1,1,1,0,...,0]     int a = function(t);    //remember: sending t is just a pointer and equal to int* t    print(a);   // output will be 1, since t will be interpreted as an int itselve. }

因此,这甚至不会返回不同的东西。如果定义数组,然后尝试获取长度,请使用sizeof。如果将数组发送给函数,请记住发送值只是第一个元素上的指针。但是,在第一种情况下,您始终知道阵列的大小。可以通过定义两个函数来找出情况二,而会损失一些性能。定义函数(数组t)和函数2(数组t,int size_of_t)。调用" function(t)"通过一些复制工作来测量长度,然后将结果发送到function2,您可以在其中对可变数组大小执行任何操作。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有