int,int32_t,int64_t

一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较:

16位平台

char         1个字节8位
short        2个字节16位
int            2个字节16位
long         4个字节32位
指针         2个字节

32位平台

char         1个字节8位
short        2个字节16位
int            4个字节32位
long         4个字节
long long 8个字节
指针         4个字节

64位平台

char         1个字节
short        2个字节
int            4个字节
long         8个字节(区别)
long long 8个字节
指针        8个字节(区别)

二、编程注意事项

为了保证平台的通用性,程序中尽量不要使用long数据库型。可以使用固定大小的数据类型宏定义:

typedef signed char       int8_t

typedef short int             int16_t;

typedef int                      int32_t;

# if __WORDSIZE == 64
typedef long int              int64_t;
# else
__extension__
typedef long long int      int64_t;

#endif

三、使用int时也可以使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同,但都是标准的平台长度,比如64位机器它的长度就是8字节,32位机器它的长度是4字节,定义如下:

#if __WORDSIZE == 64
typedef long int                intptr_t;
#else
typedef int                        intptr_t;
#endif
编程中要尽量使用sizeof来计算数据类型的大小

以上类型定义都有相应的无符号类型。

另外还有ssize_t和size_t分别是sign size_t和unsigned signed size of computer word size。它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型,从某种意义上来说它们等同于intptr_t和 uintptr_t。它们在stddef.h里面定义。需要注意的是socket的accept函数在有些操作系统上使用size_t是不正确的,因为 accept接收的int*类型,而size_t可能是long int 类型。后来BSD使用sock_t来替代它。

时间: 2025-01-02 04:50:27

int,int32_t,int64_t的相关文章

In function 'int av_clipl_int32_c(int64_t)': error: 'UINT64_C' was not declared in this scope

cygwin下使用ndk编译jni时遇到的错误: /ffmpeg/include/libavutil/common.h: In function 'int av_clipl_int32_c(int64_t)': /ffmpeg/include/libavutil/common.h:178:47: error: 'UINT64_C' was not declared in this scope 解决方法: 修改头文件 /ffmpeg/include/libavutil/common.h 添加如下代

线程安全变量控制显示隐藏loading框

一.线程安全变量控制显示隐藏loading框 问题描述: 同一页面有两个异步网络请求,第一个请求开始,loading旋转,第二个请求开始loading旋转,第一个结束,loading停止旋转,可是这时第二个请求还没有结束,然后loading就结束了,于是问题就来了. 解决方案: 二.由上面问题引申出的问题: 1. #import <libkern/OSAtomic.h> 这段话是从网上copy过来的,总结了一下原子操作的作用.但是文中提到的osbase.h文件找不到.可能是因为版本升级我的li

线程安全-一个VC下多个网络请求

一.线程安全变量控制显示隐藏loading框 问题描写叙述: 同一页面有两个异步网络请求,第一个请求開始,loading旋转.第二个请求開始loading旋转.第一个结束,loading停止旋转,但是这时第二个请求还没有结束.然后loading就结束了,于是问题就来了. 解决方式: 二.由上面问题引申出的问题: 1. #import <libkern/OSAtomic.h> 这段话是从网上copy过来的.总结了一下原子操作的作用. 可是文中提到的osbase.h文件找不到.可能是由于版本号升级

常用数据类型对应字节数,int长度

常用数据类型对应字节数: 这两台机器,前者32位,后者64位,测试了以下数据类型的长度: 前者: int:4,long:4,long long:8 后者: int:4,long:8,long long:8 不是说int会变吗,为何变得是long? 还有如果要写个通用的程序,订死必须用4个或8个字节的数据类型,在不需要重新编码编译的前提下,该如何处理这种变化? 谢谢指教.. 2楼 发表于 2008-4-15 09:35 QUOTE: 原帖由 maxxfire 于 2008-4-15 09:28 发

64位linux系统下编译int32_t

在64位Linux系统下编译执行一下程序输出结果为 40 8 #include <stdio.h> #include <stdlib.h> #include <stdint.h> void print_size(int32_t array[10]){ printf("%ld\n",sizeof(array)); } int main() { int32_t myarray[10]; printf("%ld\n",sizeof(my

redis源码学习_整数集合

redis里面的整数集合保存的都是整数,有int_16.int_32和int_64这3种类型,和C++中的set容器差不多. 同时具备如下特点: 1.set里面的数不重复,均为唯一. 2.set里面的数是从小到大有序的,这在后面的intsetAdd函数中可以看到. 然后由于我们可以同时存储int_16.int_32和int_64这3种类型,一开始只能为一种类型.假设为int_32,那么我们要插入一个int_16类型的数,只需要找到位置直接插入就可以了:但是我们要插入一个int_64类型的数,我们

Redis 基础数据结构与对象

Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象.列表对象.哈希对象.集合对象和有序结合对象共5种类型的对象. 1 简单动态字符串 redis自定义了简单动态字符串数据结构(sds),并将其作为默认字符串表示. struct sdshdr { unsigned int len; unsigned int free; char buf[

有关stdint.h 文件

有关stdint.h 文件 Google C++编程规范的P25页有如下叙述: <stdint.h> 定义了 int16_t . uint32_t . int64_t 等整型,在需要确定大小的整型时可以使用它们代替 short . unsigned long long 等,在 C 整型中,只使用 int .适当情况下,推 荐使用标准类型如 size_t 和 ptrdiff_t . 最常使用的是,对整数来说,通常不会用到太大,如循环计数等,可以使用普通的 int . 你可以认为 int 至少为

C++ 关键字浅谈

这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标示符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return sizeof sizeof sizeof sizeof sizeof sizeof sizeof sizeof (int); } 这个交卷,而且这个可以任意长.动动脑经,应该是可以想出来的.我们从很久很久以前(long long ago)开始吧, unsigned long long int ago;