我对以下代码段感到困惑:
movsx ecx, [ebp+var_8] ; signed move
cmp ecx, [ebp+arg_0]
jnb short loc_401027 ; unsigned jump
Run Code Online (Sandbox Code Playgroud)
这似乎有冲突.Var_8似乎是在签名扩展帐户上签名的.然而,jnb暗示var_8未在帐户上签名,它是无符号的比较.
那么,var_8是签名还是未签名?那么arg_0呢?
我正在使用miscutil库来使用套接字在Java和C#应用程序之间进行通信.我试图找出以下代码之间的区别(这是Groovy,但Java结果是相同的):
import java.io.*
def baos = new ByteArrayOutputStream();
def stream = new DataOutputStream(baos);
stream.writeInt(5000)
baos.toByteArray().each { println it }
/* outputs - 0, 0, 19, -120 */
Run Code Online (Sandbox Code Playgroud)
和C#:
using (var ms = new MemoryStream())
using (EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Big, ms, Encoding.UTF8))
{
writer.Write(5000);
ms.Position = 0;
foreach (byte bb in ms.ToArray())
{
Console.WriteLine(bb);
}
}
/* outputs - 0, 0, 19, 136 */
Run Code Online (Sandbox Code Playgroud)
如您所见,最后一个字节是-120Java版本和136C#.
我需要在C中执行一个真正的数学模.我有理由允许模数参数的负数,因为我的模块计算会产生负中间结果,必须将其放回到最少残留系统中.但是,我写道,允许负面模块是没有意义的
unsigned int mod( int x, unsigned int m )
{
int r = x % m;
return r >= 0 ? r : r + m;
}
Run Code Online (Sandbox Code Playgroud)
然而,使用负数和正模块调用此类函数
printf("%u\n", mod(-3, 11));
Run Code Online (Sandbox Code Playgroud)
产生输出
1
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.你能解释一下吗?
编辑:我知道运算符%与数学模数不同,我知道如何定义正数和负数.我问的是它会为不同的签名做些什么,而不是不同的标志.
我正在ResumeThread使用winapi crate从 Rust调用WinAPI 函数。
文档说:
如果函数成功,则返回值是线程先前的挂起计数。
如果函数失败,则返回值是 (DWORD) -1。
如何有效地检查是否有错误?
在 C 中:
if (ResumeThread(hMyThread) == (DWORD) -1) {
// There was an error....
}
Run Code Online (Sandbox Code Playgroud)
在 Rust 中:
unsafe {
if ResumeThread(my_thread) == -1 {
// There was an error....
}
}
Run Code Online (Sandbox Code Playgroud)
unsafe {
if ResumeThread(my_thread) == -1 {
// There was an error....
}
}
Run Code Online (Sandbox Code Playgroud)
我理解错误;但是在语义上与 C 代码相同的最佳方式是什么?对照std::u32::MAX?
我已经阅读了类似的问题,但在这种情况下,我找不到能帮助我理解这个警告的问题.我正在尝试学习C的第一周,所以请提前道歉.
我收到以下警告并注意:
In function 'read_line':
warning: pointer targets in passing argument 1 of 'read_byte' differ in signedness [-Wpointer-sign]
res = read_byte(&data);
^
note: expected 'char *' but argument is of type 'uint8_t *'
char read_byte(char * data)
Run Code Online (Sandbox Code Playgroud)
在尝试编译此代码时:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
char read_byte(char * data)
{
if(fs > 0 )
{
int n = read(fs, data, 1);
if (n < 0)
{
fprintf(stderr, "Read error\n");
return 1;
}
}
return *data; …Run Code Online (Sandbox Code Playgroud) 以下代码
char buffer[BSIZE];
...
if(buffer[0]==0xef)
...
Run Code Online (Sandbox Code Playgroud)
给编译器警告"由于数据类型的范围有限,比较始终为false".当我将支票更改为时,警告消失了
if(buffer[0]==0xffffffef)
Run Code Online (Sandbox Code Playgroud)
这感觉非常违反直觉.char以十六进制检查特定字节值的正确方法是什么?(除了使其无符号)