C 中数据类型的大小、最小值和最大值
Size, minimum and maximum values of data types in C
我需要确定C中以下类型的大小、最小值和最大值:
- 字符
- 无符号字符
- 短
- 整数
- 无符号整数
- 无符号长整数
- 浮动
我希望有人能帮我澄清一下:
- 在此上下文中 "size" 一词的确切含义是什么?
比如我写了下面的代码:
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main(void)
{
char c;
int h = sizeof(c);
printf("%.6d\n", h);
int n;
h = sizeof(n);
printf("%.6d\n", h);
}
它为 char 输出 1,为 int 输出 4。这些数字是什么意思?
如何使用一些简单的初学者 C 代码确定最小值和最大值?
"unsigned" 这个词在这个上下文中是什么意思?
- sizeof中使用的word size是指该类型在内存中占用的字节数。 char 是 4 个字节(36 位),而整数是 1 个字节(8 位)。
- 要获得最小值和最大值,您可以使用库 limits.h,如 here 所述。例如,如果你想知道一个整数可以存储的最大值,你可以简单地输出常量
INT_MAX
- 单词"unsigned"表示字节将仅用于存储自然数,因此没有"sign"。例如,
unsigned int
用于从 0 到 4,294,967,295(4 字节整数)的数字,而 int
存储从 -2,147,483,648 到 2,147,483,647(同样是 4 字节整数)
- 在此上下文中,“大小”一词的确切含义是什么?
对于h = sizeof(n);
,sizeof
是对象在内存中占用的字节数。在 C 语言中,一个“字节”通常是 8 位,但也可能更多。使用 CHAR_BITS
.
number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
(minimum value)
C11 dr §5.2.4.2.1 1
Values stored in non-bit-field objects of any other object type consist of n × CHAR_BIT
bits, where n is the size of an object of that type, in bytes. ...
§6.2.6.1 4
要正确计算和打印尺寸,请使用类型 size_t
和 "%zu"
。
#include <stddef.h>
#include <stdio.h>
some_type n;
size_t h = sizeof(n);
printf("Byte size: %zu, Bits/byte: %d, Bit size: %zu\n", h, CHAR_BIT, h * CHAR_BIT);
// Octet is the common "outside of C" meaning of a "byte" of 8 bits/byte
printf("Octet size: %g\n", (h * CHAR_BIT)/8.0);
- 如何使用一些简单的初学者 C 代码确定最小值和最大值?
C 类型丰富 - 有很多类型。健壮的代码不会尝试计算类型的 min/max,而是使用各种包含文件中定义的常量。
尝试编写计算类型(无符号类型除外)的 min/max 的代码通常会遇到 未定义的行为 (UB) 或 实现定义的行为 。避免这种情况。
// FP limits
#include <float.h>
// Standard integers
#include <limits.h>
// Fixed width, minimum width, fast integers
#include <stdint.h>
// Extended multibyte/wide characters
#include <wchar.h>
要打印这些,请务必使用正确的类型和值。有关详细信息,请研究 fprintf()
#include <stdio.h>
printf("char range %d ... %u\n", CHAR_MIN, CHAR_MAX);
printf("unsigned char range %u ... %u\n", 0, UCHAR_MAX);
printf("short range %d ... %d\n", SHRT_MIN, SHRT_MAX);
printf("int range %d ... %d\n", INT_MIN, INT_MAX);
printf("unsigned int range %u ... %u\n", 0, UINT_MAX);
printf("unsigned long range %lu ... %lu\n", 0, ULONG_MAX);
printf("float finite range %.*g ... %.*g\n", FLT_DECIMAL_DIG, -FLT_MAX,
FLT_DECIMAL_DIG, FLT_MAX);
示例输出 - 您的可能不同
char range -128 ... 127
unsigned char range 0 ... 255
short range -32768 ... 32767
int range -2147483648 ... 2147483647
unsigned int range 0 ... 4294967295
unsigned long range 0 ... 18446744073709551615
float finite range -3.40282347e+38 ... 3.40282347e+38
许多编译器支持浮点类型的 + 或 +/- infinity。这样,最大的float
就是INFINITY
。研究 HUGE_VALF
以获得最大 float
的其他想法。
- 在这种情况下,“无符号”一词是什么意思?
整数 类型缺少符号位。它的最小值为 0。
我需要确定C中以下类型的大小、最小值和最大值:
- 字符
- 无符号字符
- 短
- 整数
- 无符号整数
- 无符号长整数
- 浮动
我希望有人能帮我澄清一下:
- 在此上下文中 "size" 一词的确切含义是什么?
比如我写了下面的代码:
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main(void)
{
char c;
int h = sizeof(c);
printf("%.6d\n", h);
int n;
h = sizeof(n);
printf("%.6d\n", h);
}
它为 char 输出 1,为 int 输出 4。这些数字是什么意思?
如何使用一些简单的初学者 C 代码确定最小值和最大值?
"unsigned" 这个词在这个上下文中是什么意思?
- sizeof中使用的word size是指该类型在内存中占用的字节数。 char 是 4 个字节(36 位),而整数是 1 个字节(8 位)。
- 要获得最小值和最大值,您可以使用库 limits.h,如 here 所述。例如,如果你想知道一个整数可以存储的最大值,你可以简单地输出常量
INT_MAX
- 单词"unsigned"表示字节将仅用于存储自然数,因此没有"sign"。例如,
unsigned int
用于从 0 到 4,294,967,295(4 字节整数)的数字,而int
存储从 -2,147,483,648 到 2,147,483,647(同样是 4 字节整数)
- 在此上下文中,“大小”一词的确切含义是什么?
对于h = sizeof(n);
,sizeof
是对象在内存中占用的字节数。在 C 语言中,一个“字节”通常是 8 位,但也可能更多。使用 CHAR_BITS
.
number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
(minimum value)
C11 dr §5.2.4.2.1 1Values stored in non-bit-field objects of any other object type consist of n ×
CHAR_BIT
bits, where n is the size of an object of that type, in bytes. ...
§6.2.6.1 4
要正确计算和打印尺寸,请使用类型 size_t
和 "%zu"
。
#include <stddef.h>
#include <stdio.h>
some_type n;
size_t h = sizeof(n);
printf("Byte size: %zu, Bits/byte: %d, Bit size: %zu\n", h, CHAR_BIT, h * CHAR_BIT);
// Octet is the common "outside of C" meaning of a "byte" of 8 bits/byte
printf("Octet size: %g\n", (h * CHAR_BIT)/8.0);
- 如何使用一些简单的初学者 C 代码确定最小值和最大值?
C 类型丰富 - 有很多类型。健壮的代码不会尝试计算类型的 min/max,而是使用各种包含文件中定义的常量。
尝试编写计算类型(无符号类型除外)的 min/max 的代码通常会遇到 未定义的行为 (UB) 或 实现定义的行为 。避免这种情况。
// FP limits
#include <float.h>
// Standard integers
#include <limits.h>
// Fixed width, minimum width, fast integers
#include <stdint.h>
// Extended multibyte/wide characters
#include <wchar.h>
要打印这些,请务必使用正确的类型和值。有关详细信息,请研究 fprintf()
#include <stdio.h>
printf("char range %d ... %u\n", CHAR_MIN, CHAR_MAX);
printf("unsigned char range %u ... %u\n", 0, UCHAR_MAX);
printf("short range %d ... %d\n", SHRT_MIN, SHRT_MAX);
printf("int range %d ... %d\n", INT_MIN, INT_MAX);
printf("unsigned int range %u ... %u\n", 0, UINT_MAX);
printf("unsigned long range %lu ... %lu\n", 0, ULONG_MAX);
printf("float finite range %.*g ... %.*g\n", FLT_DECIMAL_DIG, -FLT_MAX,
FLT_DECIMAL_DIG, FLT_MAX);
示例输出 - 您的可能不同
char range -128 ... 127
unsigned char range 0 ... 255
short range -32768 ... 32767
int range -2147483648 ... 2147483647
unsigned int range 0 ... 4294967295
unsigned long range 0 ... 18446744073709551615
float finite range -3.40282347e+38 ... 3.40282347e+38
许多编译器支持浮点类型的 + 或 +/- infinity。这样,最大的float
就是INFINITY
。研究 HUGE_VALF
以获得最大 float
的其他想法。
- 在这种情况下,“无符号”一词是什么意思?
整数 类型缺少符号位。它的最小值为 0。