奇怪的是我如何在C++中完成它,而不是在C#中.
为了清楚起见,我将两个函数粘贴在C++中,然后粘贴到C#中,并使用注释"// error"标记C#代码中有问题的行.这两个函数的作用是对参数进行编码,然后将其添加到名为byte1seeds的全局变量中.
这些是C++中的函数
//Global var:
unsigned char byte1seeds[3];
unsigned long GenerateValue( unsigned long * Ptr )
{
unsigned long val = *Ptr;
for( int i = 0; i < 32; i++ )
val = (((((((((((val >> 2)^val) >> 2)^val) >> 1)^val) >> 1)^val) >> 1)^val)&1)|((((val&1) << 31)|(val >> 1))&0xFFFFFFFE);
return ( *Ptr = val );
}
void SetupCountByte( unsigned long seed )
{
if( seed == 0 ) seed = 0x9ABFB3B6;
unsigned long mut = seed;
unsigned long mut1 …Run Code Online (Sandbox Code Playgroud) 给出以下(伪C++)代码:
float x=100, a=0.1;
unsigned int height = 63, width = 63;
unsigned int hw=31;
for (int row=0; row < height; ++row)
{
for (int col=0; col < width; ++col)
{
float foo = x + col - hw + a * (col - hw);
cout << foo << " ";
}
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
在(col - hw)为负的地方,foo的值被拧紧了一半的数组.我想因为col是int而且是第一个,表达式的这一部分转换为int并变为负数.不幸的是,显然它没有,我得到一个无符号值的溢出,我不知道为什么.
我该如何解决这个问题?使用强制转换表达整个或部分表达式?什么类型的演员表(C风格或static_cast <...>)?使用演员阵容是否有任何开销(我需要这个快速工作!)?
编辑:我将所有未签名的int更改为常规int,但我仍然想知道为什么在这种情况下我有溢出.
我的位掩码是字节,我想保持它们的原样,但我认为它们是符号扩展的.我不在乎字节被认为是正数还是负数,只要它具有相同的位设置即可.我只花了几个小时调试我的代码,然后我发现我的字节位掩码只是在它们碰巧是负面的时候有问题,需要一段时间才能找到答案.我不可能是唯一一个遇到此问题的人.有没有办法让字节表现得好像是无符号的?
我在一个论坛上遇到过这个问题.答案是这样的:
#define ISUNSIGNED(a) (a >= 0 && ~a >= 0)
//Alternatively, assuming the argument is to be a type, one answer would use type casts:
#define ISUNSIGNED(type) ((type)0 - 1 > 0)
Run Code Online (Sandbox Code Playgroud)
我对此有几个问题.为什么我们需要检查~a >= 0?第二个解决方案是什么?我不明白这句话:"论证是一种类型".更重要的是,作者指出,首先#define不适用于ANSI C(但在K&R C中可以使用).为什么不?
为了简短起见,我得到一个带符号的数字,-25771(在Java中),我需要无符号字符串表示,即"4294941525".Java认为这个数字是二进制补码,但我需要它的无符号值.
我注意到整数的toString()方法的Javadoc只转换为带符号的表示.
是否有一个按位操作,如"&0xFF",我可以做到无符号数?
我正在将iOS应用迁移到Android.
这个iOs应用程序使用类似uint32_t的类型.这是一个unsigned int 32,它在Java上不可用.
uint32_t range is 0 to 4,294,967,295.
int32_t can hold values from –2,147,483,648 to 2,147,483,647
Run Code Online (Sandbox Code Playgroud)
我在Objective-C中有这个代码:
uint32_t vectorRxV1;
UInt16 xxsDas;
[ ... ]
UInt8 CM_L = (vectorRxV1 & 0xBB000000) >> 24;
Run Code Online (Sandbox Code Playgroud)
并且:
uint32_t vectorTxV0 += ((vectorTxV1<<4) + VectorSelK0) ^ ((vectorTxV1>>5) + VectorSelK1);
Run Code Online (Sandbox Code Playgroud)
并且:
Uint8 sincroRx = (sincroRx & 0xD9);
sincroRx = (sincroRx | 0xA2);
Run Code Online (Sandbox Code Playgroud)
我不确定我是否使用long代替uint32_t(或int代替UInt8上面的代码将给出不同的值.
UPDATE
我有这些运营商:>>,<<,&,^和|.
你怎么看?
我试着乘以三个数字,但我得到一个奇怪的结果.为什么我得到如此不同的结果?
unsigned int a = 7;
unsigned int b = 8;
double d1 = -2 * a * b;
double d2 = -2 * (double) a * (double) b;
double d3 = -2 * ( a * b );
// outputs:
// d1 = 4294967184.000000
// d2 = -112.000000
// d3 = 4294967184.000000
Run Code Online (Sandbox Code Playgroud) 根据关于SO的最佳答案,我应该做的是将整数转换为C中的字符串:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <math.h>
#define digits(x) ((int)((ceil(log10(abs(x)))+1)*sizeof(char)))
int main () {
int a = 345908220;
long b = 23094809284358;
unsigned int c = 3456789234;
uint8_t d = 242;
int64_t e = -840958202029834;
int dstr_len = digits(a) + digits(b) + digits(c) +
digits(d) + digits(e) + 5;
char dstr[dstr_len];
sprintf(dstr, "%d %ld %u %u %" PRIu64, a, b, c, d, e);
printf("%s\n", dstr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎是非常低效的.我必须将我的程序链接到libmath,并为我要打印的每个整数进行三次数学调用.另外请注意,我不得不添加5 …
今天下午我更新了我的sdk,然后像往常一样运行我的应用程序,我收到了这样的错误.
${dir}\[appname]-debug-androidTest-unaligned.apk 在磁盘上不存在
我尝试构建和清理项目,但没有用.我使用android-studio.
int main()
{
unsigned int c = -1;
char *s = "Abc";
char *x = "defhe";
((strlen(s)-strlen(x))>c)? printf(s): printf(x);
}
Run Code Online (Sandbox Code Playgroud)
的值c就是4294967295和的值(strlen(s)-strlen(x))是4294967294应打印x,但在打印的S value.I上午没有得到为什么它是这样的