LONG究竟有多长,从皇帝的新衣到海康SDK

博客讲述了在不同操作系统和数据模型中,C语言中的long关键字所代表的整数长度如何因环境而异,以及在64位环境下Windows与Linux的不同数据模型导致的差异。作者通过实例揭示了海康SDK在64位Linux环境下将LONG错误地定义为32位,导致与标准不符,从而引发程序崩溃的问题。文章强调了编程语言标准和库的精确性与一致性的重要性。
摘要由CSDN通过智能技术生成

转眼之间初中毕业30年了,但我仍清楚的记得初中英语的一篇课文,题目叫《皇帝的新装》(“The king’s new clothes”)。这篇课文的前两句话是:”Long long ago, there was a king. He liked new clothes.“ 因为整篇文章不长,故事生动,文字优美,而且有很多经典的句式,所以当时老师要求要背诵这篇课文,于是学这篇文章的那几天,每天早自习时教室内外都可以听到”Long long ago, there was a king.“

640?wx_fmt=png


从那之后,每当看到LONG这个单词,我便不由地想起当年反复背诵的”Long long ago, there was a king.“

LONG是英文中的常用词汇,使用场合很多,在计算机世界里也是如此。比如在经典的C语言中,便把long定义为语言本身的关键字,下图是截取C语言标准中的关键字部分,可以看到其中包含long。

640?wx_fmt=png

在C语言中,long关键字的基本用法是用作对基本数据类型的修饰符(modifiers)。比如,在int类型前可以加上long表示更长的整数,在double前也可以加上long表示更长的浮点数。例如,下面是来自某C语言编程指南的示例。


short int smallInteger;
long int bigInteger;
signed int normalInteger;
unsigned int positiveInteger;

其中,long int可以简写为long。或者说,直接使用long定义变量时,long便代表long int。顺便说一下,本文只讨论long int,不讨论long double。

在2000年批准的C99标准中,新增了long long int的定义,用来表示比long int更长的整数。

说到这里,大家可能要问,long修饰后的整数到底有多长呢?

就像英文字典里没有定义long的精确长度,只是解释为”having considerable duration in time“一样,在C语言的标准里,也没有精确定义long和long long到底应该多长,只是做了一些限定。特意摘录C99标准中有关的文字如下: 

The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than the rank of signed char.

意思是说,要保证long long int比long int长,long int要比int长。

那么,long到底是多长呢?

简单回答,因为语言标准里没有明确定义,这个问题是因为环境不同而有差别的。读到这里,那些因为陪着小孩学编程的非软件专业朋友可能会笑话了,”你们搞软件的怎么搞的,这么个基本问题还模棱两可?“

是啊,作为一个做了二十多年软件的人,我也觉得这事搞得有点乱套,既然说是要成为工业标准,堂而皇之的称为”计算机科学“,那么该精确和严谨的就一定要尽可能精确和严谨,不能像安徒生写童话那样,用个”Long long ago, there was a king“就糊里糊涂糊弄过去了。


模糊就会导致分歧,导致误解,导致各种乱七八糟的麻烦。

话题拉回来,可能有很多理由,也可能没有什么理由,定义C标准的前辈没有明确定义long的长度,把这个问题留给了做编译器的,”你们看着办吧“。

对于做编译器的同行,这个问题一定是要确定的,因为编译器必须明确每个变量的大小,才知道要为它在内存中分配多大的空间。

编译好的程序要执行时,需要调用执行环境里的库(运行时库),传递参数时也必须以统一的约定来传。因此,这个问题又与操作系统有关。

糟糕的是,在不同的操作系统中,大家的定义可能是不同的。为了便于讨论,通常用数据模型(data model)来称呼这个问题。

不知道是幸运还是不幸,在32位环境下,Windows和Linux使

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值