求助几个类型的问题,在线等,必结帖

时间:2021-10-23 19:01:13
1: 在进行内存对齐的操作中,将指针强转为 unsigned long计算对齐位并填充冗余(a = (unsigned long )p),编译器告警,
有什么方法可以消除告警。
2:double类型的最大值是多少,我今天在对一个double数值(18446744073709551614.123,18446744073709551614十六进制位FFFFFFFFFFFFFFFE)传参进一个函数并存进buff后取出printf输出发现被截取了后面几位,输出为18446744073709552000.00000,为什么。
3:大小端转换,写了个能转换2,4,8位的大小端转换宏(宏中直接将传入的数值强转为64位,位移转换后赋值),结果编译器告警(返回值告警,比如返回给一个long型变量),如何消除告警。
4,64位大小端转换是同32位一样的整体前后转换还是将高32位于低32位分别转换(高低32位作为2个部分不变换位置)
 先感谢各位帮助下啊

6 个解决方案

#1


3.大小端转换:系统提供了htons,htonl,ntohs,ntohl,如果要稳定的话,那是用系统的函数吧,你要转换2,4,8个字节的,都可以的,从网络上来的数据时字符缓存,你要转换成整形的话,报告警告很正常,如果看到警告不舒服的话,你可以设置警告等级,在C/C++/常规中可以设置(visual studio)
4.都可以,看你喜欢怎么转,32位编译器中,一个int/long整形是32位,如果用我刚刚说的函数,直接转换就可以
int host_int = ntohl(net_int);
大小端转换一般用在网络传输上,只要控制好字节顺序,一般不需要进行大小端转换的,比如发送端windows->接收端windows,发送和接受双方都是小端,直接使用即可,不需要经过转换。只有端口和ip地址初始化的时候才需要转换成网络字节序

#2


1.这个转型你自己非常清楚就可以了。

2.你这个在浮点数标准来看就是一个NaN指数域全为1,小数部分非0。

#3


。。。。。64位大小端转换问题。比如如下64位数(0x1234567890abcdef1234567890abcdef)
(地址)0   4  8  12  16  20  24  28 32  36  40  44  48  52  56  60 
     12  34 56  78  90  ab  cd  ef 11  22  33  44  55  66  77  88 (大端)
转换为小端是以下那一种
(地址)0   4  8  12  16  20  24  28  32  36  40  44  48  52  56  60 
     88  77 66 55   44  33  22  11  ef  cd  ab  90  78  56  34  12(第一种整个一起倒换)
(地址)0   4  8  12  16  20  24  28  32  36  40  44  48  52  56  60 
      ef  cd ab 90  78  56  34  12  88  77  66  55  44  33  22  11(第二种分高低32位分别倒)
还有 double类型种的64位是同long 什么类型一样还是说留有专门的位来放小数
 告警问题就没办法解决了吗,或者是否可以换个思路来写。
以上问题是写CDR编码读写函数遇到的,不知道谁还能帮忙解答下

#4


1. 数据类型的强制转换是不会报警的,
   (a = (unsigned long )p),我看不出是指针的强制转换

2. 我的系统中 sizeof(double) = 8, 你的数字已溢出,不知你的如何

#5


引用 4 楼 anyidan 的回复:
1. 数据类型的强制转换是不会报警的,
  (a = (unsigned long )p),我看不出是指针的强制转换 p是指针类型,强转为unsigned long报警,但是强转为unsigned long long 就不会,难道指针类型是64位的?

2. 我的系统中 sizeof(double) = 8, 你的数字已溢出,不知你的如何 double是8字节

另外 环境是winXP 编译器是vs2005

#6


用类似的 #pragma warning(disable:4786) ?

#1


3.大小端转换:系统提供了htons,htonl,ntohs,ntohl,如果要稳定的话,那是用系统的函数吧,你要转换2,4,8个字节的,都可以的,从网络上来的数据时字符缓存,你要转换成整形的话,报告警告很正常,如果看到警告不舒服的话,你可以设置警告等级,在C/C++/常规中可以设置(visual studio)
4.都可以,看你喜欢怎么转,32位编译器中,一个int/long整形是32位,如果用我刚刚说的函数,直接转换就可以
int host_int = ntohl(net_int);
大小端转换一般用在网络传输上,只要控制好字节顺序,一般不需要进行大小端转换的,比如发送端windows->接收端windows,发送和接受双方都是小端,直接使用即可,不需要经过转换。只有端口和ip地址初始化的时候才需要转换成网络字节序

#2


1.这个转型你自己非常清楚就可以了。

2.你这个在浮点数标准来看就是一个NaN指数域全为1,小数部分非0。

#3


。。。。。64位大小端转换问题。比如如下64位数(0x1234567890abcdef1234567890abcdef)
(地址)0   4  8  12  16  20  24  28 32  36  40  44  48  52  56  60 
     12  34 56  78  90  ab  cd  ef 11  22  33  44  55  66  77  88 (大端)
转换为小端是以下那一种
(地址)0   4  8  12  16  20  24  28  32  36  40  44  48  52  56  60 
     88  77 66 55   44  33  22  11  ef  cd  ab  90  78  56  34  12(第一种整个一起倒换)
(地址)0   4  8  12  16  20  24  28  32  36  40  44  48  52  56  60 
      ef  cd ab 90  78  56  34  12  88  77  66  55  44  33  22  11(第二种分高低32位分别倒)
还有 double类型种的64位是同long 什么类型一样还是说留有专门的位来放小数
 告警问题就没办法解决了吗,或者是否可以换个思路来写。
以上问题是写CDR编码读写函数遇到的,不知道谁还能帮忙解答下

#4


1. 数据类型的强制转换是不会报警的,
   (a = (unsigned long )p),我看不出是指针的强制转换

2. 我的系统中 sizeof(double) = 8, 你的数字已溢出,不知你的如何

#5


引用 4 楼 anyidan 的回复:
1. 数据类型的强制转换是不会报警的,
  (a = (unsigned long )p),我看不出是指针的强制转换 p是指针类型,强转为unsigned long报警,但是强转为unsigned long long 就不会,难道指针类型是64位的?

2. 我的系统中 sizeof(double) = 8, 你的数字已溢出,不知你的如何 double是8字节

另外 环境是winXP 编译器是vs2005

#6


用类似的 #pragma warning(disable:4786) ?