相关疑难解决方法(0)

用C++表示128位数字

在C++中表示128位数的最佳方法是什么?它应该尽可能地与内置数值类型一致(即支持所有算术运算符等).

我正在考虑构建一个具有2个64位或4个32位数的类.或者可能只是创建一个128位的内存块并自己完成所有操作.

是否有一些更容易/更标准的方式,或者我自己实施它时不太可能搞砸的东西?:)

如果它可以扩展到256位,512位等等也会很好...

c++ math

55
推荐指数
6
解决办法
7万
查看次数

C和C++中float和double的大小是多少?

我正在寻找是否有任何类似的标准类型uint32_t总是映射到32位无符号整数类型,但我找不到任何.

float所有平台上的大小总是4字节?
大小double总是8?

两种标准都有关于此事的任何说法吗?

我想确保我的大小在所有平台(x86和x64)上总是相同的,所以我使用标准的int类型,但我找不到任何类似的typedef for floatdouble.

c c++ floating-point 64-bit x86

24
推荐指数
4
解决办法
7万
查看次数

存储IPv4/IPv6地址的有效方法

我正在开发一个C/C++网络项目,它应该能够使用IPv4和IPv6网络堆栈.该项目仅适用于Linux.因此,我试图找到一种有效的方法来存储IP地址并区分协议系列.第一种方法是建立一个联盟:

struct ip_addr {
   uint8_t fam; // socket family type
   union {
       struct in_addr ipv4_sin_addr;
       struct in6_addr ipv6_sin_addr;
   }addr;
};
Run Code Online (Sandbox Code Playgroud)

第二种方法是typedef std::vector<unsigned char> IPAddressNumber在向量的字节数之后定义a 并产生差异.

第三种方法是使用gcc中的int128_t/uint128_t或__int128_t.

对于最后一种情况,我想知道哪些版本的GCC支持这些类型,适用于哪些平台(尤其是IA-32/IA-64)以及是否存在任何已知错误.此外,上述哪种解决方案可能是最方便的解决方案?

c++ gcc ipv4 ipv6 int128

7
推荐指数
2
解决办法
5689
查看次数

将IPv6地址转换为64位double

IPv6地址是底层的128位无符号整数,因此它们的值范围为[0,3.40×10 ^ 38]

一个128位寄存器可以存储2 ^ 128(超过3.40×10 ^ 38)个不同的值。可以以128位存储的整数值的范围取决于所使用的整数表示形式。对于两种最常见的表示形式,范围是0到340,282,366,920,938,463,463,374,607,431,768,211,455(2 ^ 128?1),表示为(无符号)二进制数, https://en.wikipedia.org/wiki/128位

但是,无论使用哪种语言,双精度浮点变量都可以高达±1.79769313486231570e + 308,因此它绝对可以假定128位int可以且甚至可以包含所有值。

我确定有一个现成的功能/库/代码可以从IPv6 => double转换。任何人都可以发布代码来做到这一点,或链接吗?

谢谢

最好是PHP,但是您可以用其他语言发布代码,我将翻译成PHP。

PS我已经阅读了这个相关问题,可以双重使用来存储和安全地检索128位IPv6吗?但是IMO的答案是错误的,因为您不需要与IPv6地址(128位)具有相同位的变量。您只需要它能够假定IPv6可以具有的所有可能值。正如我上面所说,双精度数可以表示128位int甚至更多的可能值,尽管它仅仅是64位。

那怎么可能

这就是浮点寄存器的魔力。与整数计算相比,它们进行计算的CPU资源更多,但功能更强大。

编辑:为什么我需要这种转换:我有一个MySQL表,其IPv6地址定义为DECIMAL(39),这是一个39位的整数。如果是IPv6,我需要按访问者的地址查询该表。

php c++ floating-point ipv6

-3
推荐指数
1
解决办法
123
查看次数

标签 统计

c++ ×4

floating-point ×2

ipv6 ×2

64-bit ×1

c ×1

gcc ×1

int128 ×1

ipv4 ×1

math ×1

php ×1

x86 ×1