C++ 将大小转换为长,有什么缺点吗?

C++ 将大小转换为长,有什么缺点吗?,c++,type-conversion,long-integer,sizeof,size-t,C++,Type Conversion,Long Integer,Sizeof,Size T,将大小转换为长有什么缺点吗?因为,我正在编写一个程序,在文件中维护链接列表。因此,我根据大小\u t遍历到另一个节点,并将列表的总数作为大小\u t进行跟踪。因此,显然会有一些转换或长和大小的增加。这有什么缺点吗?如果有的话,我会把所有的东西都做成一样长的,而不是尺码,甚至是尺码。请告知 将大小转换为长有什么缺点吗 理论上,long可以小于size\u t。此外,龙是签署。大小\u t未签名。所以,若你们开始在同一个表达式中使用它们,像g++这样的编译器会对此抱怨。很多理论上,由于有符号到无符号

将大小转换为长有什么缺点吗?因为,我正在编写一个程序,在文件中维护链接列表。因此,我根据大小\u t遍历到另一个节点,并将列表的总数作为大小\u t进行跟踪。因此,显然会有一些转换或长和大小的增加。这有什么缺点吗?如果有的话,我会把所有的东西都做成一样长的,而不是尺码,甚至是尺码。请告知

将大小转换为长有什么缺点吗

理论上,long可以小于size\u t。此外,龙是签署。大小\u t未签名。所以,若你们开始在同一个表达式中使用它们,像g++这样的编译器会对此抱怨。很多理论上,由于有符号到无符号的赋值,它可能会导致意外错误

很明显,会有一些转换或长的增加

我不明白为什么要对long进行一些转换或添加。您可以继续对所有算术运算使用size\u t。您可以将其定义为“ListIndex”或其他类型,并在整个代码中一直使用它。如果你混合使用不同的类型(long和size),g++/mignw会把你烦死

或者,您可以选择具有保证大小的特定类型。较新的编译器有cstdint头,其中包括uint64_t之类的类型(例如,极不可能遇到大于2^64的文件)。如果您的编译器没有标头,那么它应该在boost中可用

将大小转换为长有什么缺点吗

理论上,long可以小于size\u t。此外,龙是签署。大小\u t未签名。所以,若你们开始在同一个表达式中使用它们,像g++这样的编译器会对此抱怨。很多理论上,由于有符号到无符号的赋值,它可能会导致意外错误

很明显,会有一些转换或长的增加

我不明白为什么要对long进行一些转换或添加。您可以继续对所有算术运算使用size\u t。您可以将其定义为“ListIndex”或其他类型,并在整个代码中一直使用它。如果你混合使用不同的类型(long和size),g++/mignw会把你烦死


或者,您可以选择具有保证大小的特定类型。较新的编译器有cstdint头,其中包括uint64_t之类的类型(例如,极不可能遇到大于2^64的文件)。如果您的编译器没有标头,那么它应该在boost中可用

现在不是问题,但将来可能会有问题,这取决于你将把应用程序移植到哪里。这是因为size\u t被定义为足够大以存储指针的偏移量,所以如果您有一个64位指针,size\u t也将是64位的。现在,long可能是64位,也可能不是64位,因为C/C++中基本类型的大小规则允许一些变化

但是,如果要将这些值写入文件,则必须选择特定的大小,因此除了转换为long(或long-long,如果需要)之外,没有其他选项。更好的是,使用一种新的特定于大小的类型,如int32\t


我的建议是:在文件头的某个地方,存储您将大小转换为的类型的大小。通过这样做,如果将来您决定使用更大的尺寸,您仍然可以支持旧尺寸。对于当前版本的程序,您可以检查大小是否受支持,如果不受支持,则会发出错误。

这现在不是问题,但将来可能会出现问题,具体取决于您将应用程序移植到的位置。这是因为size\u t被定义为足够大以存储指针的偏移量,所以如果您有一个64位指针,size\u t也将是64位的。现在,long可能是64位,也可能不是64位,因为C/C++中基本类型的大小规则允许一些变化

但是,如果要将这些值写入文件,则必须选择特定的大小,因此除了转换为long(或long-long,如果需要)之外,没有其他选项。更好的是,使用一种新的特定于大小的类型,如int32\t

我的建议是:在文件头的某个地方,存储您将大小转换为的类型的大小。通过这样做,如果将来您决定使用更大的尺寸,您仍然可以支持旧尺寸。对于当前版本的程序,您可以检查大小是否受支持,如果不受支持,则发出错误。

不幸的是,“long”类型没有良好的理论基础。最初,它是在32位unix端口上引入的,以区别于现有PDP11软件假定的16位“int”。后来,在这些平台上,“int”改为32位(并引入了“short”),而“long”和“int”成为同义词,它们在很长一段时间内都是同义词

现在,在64位类unix平台(Linux、BSD、OSX、iOS以及人们可能仍然关心的任何专有unix)上,“long”是一个64位的量。但是,不幸的是,windows上没有:在现有的头文件中有太多的遗留“代码”使得sizeof(int)==sizeof(long)假设,因此它们使用了一个叫做“LLP64”的讨厌的东西,并且保留了32位的长度。唉

但“尺码”不是这样的。它总是意味着一件事:在地址空间中存储本机指针大小的无符号类型。如果您有一个无符号(!--如果需要有符号算术,请使用ssize_t或ptrdiff_t)指针,它需要整数表示(即,您需要存储对象的内存大小),这就是您所使用的指针。

不幸的是,“long”类型没有很好的理论基础。最初,它是在32位unix端口上引入的,以区别于现有PDP11软件假定的16位“int”。后来,在这些平台上,“int”改为32位(并引入了“short”),而“long”和“int”成为同义词,它们在很长一段时间内都是同义词

现在,在像platfo这样的64位unix上