[牛人杂谈]

long与int的区别?

[复制链接]
1336|17
手机看帖
扫描二维码
随时随地手机跟帖
643757107|  楼主 | 2018-12-21 23:48 | 显示全部楼层 |阅读模式
C语言标准是这样规定的:int最少16位(2字节),long不能比int短,short不能比int长,具体位长由编译器开发商根据各种情况自己决定。在32位x86处理器上,short、int、long普遍的长度是2字节、4字节、4字节。当然如果编译器开发商愿意,long完全可以是8字节。

在 win64 下,long 也是 32 bit 的,4 字节。int则是64bit,8字节!

643757107|  楼主 | 2018-12-21 23:49 | 显示全部楼层
语言编程需要注意的64位和32机器的区别
一、数据类型特别是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来替代它。

使用特权

评论回复
yiy| | 2018-12-21 23:56 | 显示全部楼层
多谢分享,以前总以为long 比int 长呢,原来可以一样。

使用特权

评论回复
yiyigirl2014| | 2018-12-22 00:04 | 显示全部楼层
总结的挺好。

使用特权

评论回复
玛尼玛尼哄| | 2018-12-22 12:14 | 显示全部楼层
我在电脑上选择64位的开发,也是那个样子,不知道咋回事。

使用特权

评论回复
huangcunxiake| | 2018-12-23 10:04 | 显示全部楼层
还是少用,long,
short可以用用。

使用特权

评论回复
wahahaheihei| | 2018-12-23 10:24 | 显示全部楼层
好多编译器抛弃了long了,就是int

使用特权

评论回复
antusheng| | 2018-12-23 20:27 | 显示全部楼层
short可以定义16BIT的,非常方便。

使用特权

评论回复
zhuomuniao110| | 2018-12-24 12:26 | 显示全部楼层
一般数据结构才考虑这个位。不过单片机里通常不用short和long,char  unsigned char int unsigned int  用的多。

使用特权

评论回复
dongnanxibei| | 2018-12-26 22:19 | 显示全部楼层
就是嘛,最好别用long.
你不知道你的编译器是怎么处理这个的。

使用特权

评论回复
zhuomuniao110| | 2018-12-26 23:37 | 显示全部楼层
我知道如果数据类型非常重要。而且一定要注意不能超界

使用特权

评论回复
xiaoqizi| | 2019-1-7 13:20 | 显示全部楼层
这么基础的知识。。。

使用特权

评论回复
木木guainv| | 2019-1-7 13:27 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
heimaojingzhang| | 2019-1-8 11:26 | 显示全部楼层
跟单片机是多少位有直接关系

使用特权

评论回复
dongnanxibei| | 2019-1-8 14:37 | 显示全部楼层
使用一个新的硬件平台开发时候先做个测试。

使用特权

评论回复
dongnanxibei| | 2019-1-8 14:38 | 显示全部楼层
确定好你用到的变量类型都是多少BIT的,还有就是大小端问题,会牵涉到共用体或结构体。

使用特权

评论回复
dongnanxibei| | 2019-1-8 14:38 | 显示全部楼层
变量的段位操作就是要考虑的

使用特权

评论回复
yiyigirl2014| | 2019-1-9 12:29 | 显示全部楼层
long是整形吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

3689

帖子

11

粉丝