总结 2038问题和字节序

来源:互联网 发布:linux more 显示行号 编辑:程序博客网 时间:2024/05/19 02:00

 

1、2038问题

在vs2005之前的time_t 是32位,即:
time(0)返回系统从1970年1月1日0时0分0秒到当前的秒数,
因为time_t是32位长,所以最大能表示到2038年1月18日,再大则溢出。
在vs2005及更高的版本中,time_t和time(0)等相关数据默认都升级为64位,
若仍旧想使用32位格式存储,可以定义宏_USE_32BIT_TIME_T或强制截断。
最好使用64位,尽管多了一倍的存储空间,但是系统在时间问题上没有了2038的后患。

 

2、字节序问题

字节序是一些内定数据类型如int、short等的高低字节在内存中存放的顺序,
有BIG-ENDIAN(MSB到LSB)、LITTLE-ENDIAN(LSB到MSB)两种,
字节序依赖于于CPU、编程语言和网络等环境。

1、跟CPU有关,每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN。
IA架构的CPU中是Little-Endian,而PowerPC、SPARC和Motorola处理器是Big-Endian,
这其实就是所谓的主机字节序。

2、而网络字节序是指数据在网络上传输时是大头还是小头的,在Internet的网络字节序是BIG-ENDIAN。

3、编程语言JAVA在其虚拟机中多字节类型数据的存放顺序是BIG-ENDIAN;
   C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。
  
4、所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序
到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序
的转换。如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,
而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行转换即
可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。
如果两边都是自己开发的c++系统不考虑服务开放也可以忽略字节序问题,否则就要考虑字节序问题了。

 

3、更正了两个语文错误

“堂吉诃德”的“诃”读“he一声”而不读“ke”
成语“乐此不疲”而不是“乐此不彼”