Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将无符号长整型转换为有符号长整型有可能吗?_C++_C_Embedded - Fatal编程技术网

C++ 将无符号长整型转换为有符号长整型有可能吗?

C++ 将无符号长整型转换为有符号长整型有可能吗?,c++,c,embedded,C++,C,Embedded,来自传感器的数据有两种格式SAHPUINT64T和SaHpiInt64T,应用程序设计为仅处理SAHPUINT64T数据 如果可能,有什么副作用 /* unsigned 64-bit data, 8-byte alignment */ typedef unsigned long long int SaHpiUint64T __attribute__((__aligned__(8))); /* signed 64-bit data, 8-byte alignment */ typede

来自传感器的数据有两种格式SAHPUINT64TSaHpiInt64T,应用程序设计为仅处理SAHPUINT64T数据

如果可能,有什么副作用

/* unsigned 64-bit data, 8-byte alignment  */
typedef unsigned long long int  SaHpiUint64T __attribute__((__aligned__(8)));

/* signed 64-bit data, 8-byte alignment    */
typedef signed long long int SaHpiInt64T __attribute__((__aligned__(8)));

是的,有可能。你甚至不需要演员阵容。只需将
long-long-int
赋值给
无符号long-long-int
变量即可

但是,
long int
当然可以包含负值。如果您的
long-long-int
传感器读数从不为负值,则没有问题。如果它们可以为负值,则在转换为
无符号长整型时,这些负值将变为大正数。你如何处理这件事,如果你处理好了,这取决于你自己


如果您知道传感器可以产生负值,则添加偏移量使偏移量值始终为非负值更有意义。有两种选择是传感器的最小可能读数和最小无符号长整型。使用这种偏移方法,在最大可能的有符号值处不再存在不连续。

确定您可以转换它们,但您可能对数据的解释完全错误:D

整数变量的最后一位(最高值)是有符号整数的变量的符号

现在,如果您感测有符号值,并且感测负变量,然后将其转换为无符号变量,那么在本例中,您将得到一个非常大的数字(2^63+abs(原始变量))

如果以无符号形式进行感测,感测到一个大于2^63的值,并将其转换为有符号整数,则最终得到一个等于(原始值-2^63)的值,这是一个负值


因此,如果你确定你的感官数据的范围,那么你可以安全地在两者之间转换,否则就不行了。

你没有偿还抵押贷款,而是买了第二套房子?澄清一下,你是在从签名转换到未签名,或者从无符号到有符号?处理器字有多宽?您希望从传感器获得什么数据?传感器能否返回负值?如果将有符号整数转换为无符号整数,您将如何区分负整数和非常大的正整数?@KerrekSB目前是的,购买第二栋房子似乎很有帮助。在现有代码中,我得到了很长的正值,因此您认为这是由于此错误吗铸造这些长的正值是否永远不会改变,即使它代表一个不断变化的参数,如开机时间,您不必强制转换,但最终会出现编译器警告(这是理所当然的)。显式施法(
static\u cast(…)
)不仅可以消除警告,还可以告诉你后面的可怜的维护编码器,你已经考虑到了影响。(是的,不是吗?@DevSolar--Re但最终会出现编译器警告。不支持gcc或clang,至少不支持相当标准的警告集(例如,
-Wall-Wextra
)。您需要使用gcc/clang显式指定编译器选项
-Wconversion
,以获得关于将有符号整数隐式转换为相同大小的无符号整数的警告。(甚至对于C++来说,这也不适用。你需要指定代码> -WSCORE转换< /COD>作为一个编译器选项来获得这个警告。)尽管如此,在这里,一个很好的主意是因为它暗示了意图。@ DavidHammen:实际上我的“标准”警告集看起来更像“一切和厨房的水槽”。在我的MaX文件中横跨了三行,所以我甚至没有考虑过<代码> -WALW-WOTER < /代码>的不适当性。你是对的,当然-
-Wall-Wextra
不能解决这个问题。