首页 > 解决方案 > C:在使用相同的 8 字节空间的情况下,long long 的范围如何比 long 大得多?

问题描述

我写了一个简短的程序,它使用sizeof()运算符了解 C 中各种数据类型使用的空间,以及gcc64 位 Linux 上的编译器。输出如下所示:

A unit "signed char" takes: 1 bytes.
A unit "unsigned char" takes: 1 bytes.
A unit "short signed int" takes: 2 bytes.
A unit "short unsigned int" takes: 2 bytes.
A unit "signed int" takes: 4 bytes.
A unit "unsigned int" takes: 4 bytes.
A unit "long signed int" takes: 8 bytes.
A unit "long unsigned int" takes: 8 bytes.
A unit "signed long long int" takes 8 bytes.
A unit "unsigned long long int" takes 8 bytes.
A unit "float" takes: 4 bytes.
A unit "double" takes: 8 bytes.
A unit "long double" takes: 16 bytes.
A unit "string" takes: 2 bytes.

我的问题与long int数据long long int类型有关。

  1. 如果我们查看这两个的默认变体,当它使用相同的每个单元的 8 字节空间时signed,如何long long能够具有比(-2,147,483,648 到 2,147,483,647)更高的范围(-9,223,372,036,854,775,807 到 9,223,372,036,854,775,807) ?long还,
  2. 为什么要使用long,而不是一直使用long long

编辑: 我从这里查看使用 gcc 进行 32 位编译的范围,而不是 64 位,这导致了混乱。修改我的代码以在输出中包含范围以及大小,使用limits.h. 更正后的输出现在显示为:

Unit "signed char" -> 1 bytes -> range: -128 - +127.
Unit "unsigned char" -> 1 bytes -> range: 0 - 255.


Unit "short signed int" -> 2 bytes -> range: -32768 - +32767.
Unit "short unsigned int" -> 2 bytes -> range: 0 - 65535.

Unit "signed int" -> 4 bytes -> range: -2147483648 - +2147483647.
Unit "unsigned int" -> 4 bytes -> range 0 - 4294967295.

Unit "long signed int" -> 8 bytes -> range: -9223372036854775808 - +9223372036854775807.
Unit "long unsigned int" -> 8 bytes -> range 0 - 18446744073709551615.

Unit "signed long long int" -> 8 bytes -> range -9223372036854775808 - +9223372036854775807.
Unit "unsigned long long int" -> 8 bytes -> range 0 - 18446744073709551615.


Unit "float" -> 4 bytes.
Unit "double" -> 8 bytes.
Unit "long double" -> 16 bytes.
Unit "string" -> 2 bytes.

标签: cgcctypes

解决方案


问题 1 包含错误。范围(-2,147,483,648 到 2,147,483,647)适用于 4 字节有符号值 - 在您的情况下是 a signed int,而不是 a signed long。在您的系统long上,a 的范围与 a 一样宽long long,因此您没有真正需要使用long long。但在其他系统上,大小可能会有所不同,而这些差异可能对您很重要。


推荐阅读