标签: signedness

x86汇编中的冲突符号:movsx然后是unsigned compare/branch?

我对以下代码段感到困惑:

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呢?

x86 assembly masm micro-optimization signedness

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

使用miscutil的C#和java大端字节之间的区别

我正在使用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# java byte endianness signedness

2
推荐指数
1
解决办法
2022
查看次数

signed int modulo unsigned int产生无意义的结果

我需要在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)

我不明白为什么.你能解释一下吗?

编辑:我知道运算符%与数学模数不同,我知道如何定义正数和负数.我问的是它会为不同的签名做些什么,而不是不同的标志.

c modulo signedness mod

2
推荐指数
1
解决办法
504
查看次数

如何在 Rust 代码中表示 C 的“无符号负”值?

我正在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?

ffi signedness rust

2
推荐指数
1
解决办法
210
查看次数

传递参数中的指针目标在签名方面有所不同

我已经阅读了类似的问题,但在这种情况下,我找不到能帮助我理解这个警告的问题.我正在尝试学习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)

c warnings pointers signedness

1
推荐指数
1
解决办法
2万
查看次数

如何用十六进制表示负char值?

以下代码

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以十六进制检查特定字节值的正确方法是什么?(除了使其无符号)

c hex char signedness

0
推荐指数
1
解决办法
2460
查看次数

标签 统计

signedness ×6

c ×3

assembly ×1

byte ×1

c# ×1

char ×1

endianness ×1

ffi ×1

hex ×1

java ×1

masm ×1

micro-optimization ×1

mod ×1

modulo ×1

pointers ×1

rust ×1

warnings ×1

x86 ×1