C中数据类型的大小,最小值和最大值

时间:2018-07-26 02:50:02

标签: c types size unsigned

我需要确定C中以下类型的大小,最小值和最大值:

  • char
  • 未签名的字符
  • int
  • 无符号整数
  • 无符号长
  • 浮动

我希望有人可以帮助我澄清以下内容:

  1. 在这种情况下,“尺寸”一词到底是什么意思?

例如,我编写了以下代码:

#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。这些数字是什么意思?

  1. 如何用一些简单的初学者C代码确定最小值和最大值?

  2. 在这种情况下,“无符号”一词是什么意思?

2 个答案:

答案 0 :(得分:2)

  1. 在这种情况下,“尺寸”一词到底是什么意思?

对于h = sizeof(n);sizeof是对象在内存中占用的字节个数。在C语言中,“字节”通常为8位,但可能更多。使用CHAR_BITS

  

不是位字段的最小对象的位数(字节)
  CHAR_BIT 8(最小值)
  C11博士§5.2.4.2.11

     

存储在任何其他对象类型的非位字段对象中的值由n×{CHAR_BIT位组成,其中n是该类型对象的大小(以字节为单位)。 ...
  §6.2.6.14

要正确计算和打印尺寸,请使用类型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);

  1. 如何用一些简单的初学者C代码确定最小值和最大值?

C的类型丰富-有很多类型。健壮的代码不会尝试计算类型的最小值/最大值,而是使用各种包含文件中定义的常量。

要尝试编写用于计算某种类型(除 unsigned类型之外)的最小值/最大值的代码,通常会遇到未定义行为(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的其他想法


  1. 在这种情况下,“无符号”一词是什么意思?

整数类型缺少符号位。最小值为0。

答案 1 :(得分:1)

  1. sizeof中使用的字大小表示该类型在内存中占用多少字节。一个char是4个字节(36位),而一个整数是1个字节(8位)。
  2. 要获取最小值和最大值,可以按照here中的说明使用库limits.h。例如,如果您想知道整数可以存储的最大值,则只需输出常量INT_MAX
  3. “无符号”一词意味着字节将仅用于存储自然数,因此不包含“符号”。例如,unsigned int用于存储0到4,294,967,295(4字节整数)的数字,而int存储从-2,147,483,648到2,147,483,647(又是4字节整数)的数字