c - C:在使用相同的 8 字节空间的情况下,long long 的范围如何比 long 大得多?
问题描述
我写了一个简短的程序,它使用sizeof()
运算符了解 C 中各种数据类型使用的空间,以及gcc
64 位 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
类型有关。
- 如果我们查看这两个的默认变体,当它使用相同的每个单元的 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
还, - 为什么要使用
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.
解决方案
问题 1 包含错误。范围(-2,147,483,648 到 2,147,483,647)适用于 4 字节有符号值 - 在您的情况下是 a signed int
,而不是 a signed long
。在您的系统long
上,a 的范围与 a 一样宽long long
,因此您没有真正需要使用long long
。但在其他系统上,大小可能会有所不同,而这些差异可能对您很重要。
推荐阅读
- javascript - 使用迭代访问嵌套的 javascript 对象子属性
- textbox - Tip/warning/definition/description boxes in Markdown
- python - How to generate complex ORM code and REST API with swagger-codegen?
- angular - 带有 .forEach 的自定义验证器 - 可以做得不同(更好)吗?
- c - 如何从 c 调用 opaque_wrapper 结构?
- c++ - 如何将图像文件夹添加到 CMake 项目以便在 c++ 可执行文件中使用这些图像?
- vhdl - 蓄能器设计
- c++ - 将 HEX char 数组存储在字节数组中,而不更改为 ASCII 或其他任何东西
- sql-server - 一个应用程序池允许的开放 SQL 连接数?
- java - 如何从 Spring Boot 控制器返回超链接?