文章

数据类型 基本类型

数据类型 基本类型

[TOC]

以下内容仅针对 Windows 平台,Visual Studio 平台。

但也不一定是准确的,届时可以可以通过 sizeof()来判断,sizeof()返回的即为字节数

1
cout << "Size of long: " << sizeof(long) << " bytes" << endl;

sizeof() 是个操作符,可用于任何类型或变量,包括数组、结构体、指针等,返回的是一个类型或变量所占用的字节数;在编译时求值,不会对表达式进行求值。

short

  • 大小:2 字节(32位 / 64位)
  • 范围:-32767 ~ 32767

unsigned short

  • 大小:2 字节(32位 / 64位)
  • 范围:0 ~ 65535(非负数)

int

  • 大小:2字节(16位系统),4字节(32位 / 64位系统)
  • 范围:-2147483648 ~ 2147483648

(1) int 类型的前缀和后缀

C++还支持前缀后缀来表示整型常量的类型。以下是一些示例:1

  • 后缀u表示unsigned类型:123u
  • 后缀l表示long类型:123l
  • 后缀ul表示unsigned long类型:123ul
  • 前缀0b表示二进制常量:0b1101
  • 前缀0表示八进制常量:0173
  • 前缀0x表示十六进制常量:0x7B

在使用整型常量时,如果超出了该类型所能表示的范围,则会出现溢出问题。例如,如果使用8位无符号整型表示256,则其值将为0,因为8位无符号整型的范围是0到255。

(2) int 类型的非十进制输出

  • C++不直接支持二进制的输入输出,需要bitset<>()做转换。需要包含头文件#include<bitset>才能使用,语法:1
1
2
3
cout << 0b00001010 << endl;//结果为83,cout默认是输出十进制。
cout << bitset<8>(0b00001010) << endl;// 结果为二进制00001010
// 注意:bitset中的位数只能是8、16、31、64中的一个。
  • std::cout默认是十进制输出,如果需要转换为八进制、十六进制输出需要加上octhex
1
2
3
4
5
cout << 0123 << endl;         //结果为83,cout默认是输出十进制。
cout << oct << 0123 << endl;  //结果为八进制的123
  
cout << 0xab << endl;         //结果为171,cout默认是输出十进制。
cout << hex << 0xab << endl;  //结果为十六进制的ab

long

  • 大小:4字节(16位系统 / 32位系统 / 64位Win系统),8字节(64位Linux、macOS系统)。
  • 在 C++ 标准中,规定 long 类型不能小于int类型。

unsigned long

  • 大小:4字节(32位 / 64位)
  • 范围:0 ~ 4294967295

long long

  • 大小:8字节(32位 / 64位)

float

  • 大小:4字节(32位 / 64位)

double

  • 大小:8字节(32位 / 64位)

char

  • 大小:1字节(32位 / 64位)

size_t

size_t 是在C标准库的头文件(如 <stddef.h><cstdio><cstring> 等)中定义的,并在C++中被广泛采用。在C++中,size_t 定义在许多头文件中,包括但不限于 <cstddef><cstdio><cstring><cstdlib><iostream> 等。

size_t 是为了方便系统之间的移植而定义的,size_t 的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。

(1) size_t的定义

size_t 是一个平台相关的类型,它的精确大小依赖于编译程序运行的系统架构。

不同的系统上,size_t 的定义不一样:2

  • 32位系统: typedef unsigned int size_t,也就是32位无符号整型。
  • 64位系统: typedef unsigned long size_t,也就是64位无符号整型。

(2) size_t的应用

使用 size_t 而非固定宽度的整数类型(如 uint32_tuint64_t)有助于提高代码在不同平台上的移植性和安全性。

size_t 通常用于表示大小和计数,比如数组的大小、容器的长度、以及循环中的索引计数等。

这个类型能够足够大到表达任何对象(如数组和字符串)可能的大小,因此也通常用于内存分配和指针算术运算。例如, size_t 用做sizeof 操作符的返回值类型,同时也是很多函数的参数类型,包括mallocstrlen3

下面是一些常见的 size_t 使用场景:3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <vector>
#include <iostream>
#include <cstddef> // 包含size_t的定义

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用size_t遍历vector
    for (size_t i = 0; i < vec.size(); ++i) {
        std::cout << vec[i] << std::endl;
    }

    // 使用size_t接收string的长度
    std::string str = "Hello World";
    size_t length = str.length();

    // 使用size_t在malloc中分配内存
    int* array = (int*)malloc(10 * sizeof(int));
    if (array) {
        // 适当使用size_t进行索引和计数
        for (size_t i = 0; i < 10; ++i) {
            array[i] = static_cast<int>(i);
        }
    }

    // 不要忘记释放分配的内存
    free(array);

    return 0;
}

在上面的例子中,size_t 被用于数组索引和计数,这是最常见的用法之一。在一些编程实践中,也可能会看到 size_t 被用作函数参数的类型,或者作为函数的返回类型来表示大小。

参考文章45

本文由作者按照 CC BY 4.0 进行授权