标签: unsigned

为无符号类型分配符号文字时,为什么GCC不会产生警告?

本网站上的几个问题揭示了混合有符号和无符号类型时的缺陷,大多数编译器似乎都很好地生成了这种类型的警告.但是,GCC在将有符号常量赋值给无符号类型时似乎并不在意!考虑以下程序:

/* foo.c */
#include <stdio.h>
int main(void)
{
    unsigned int x=20, y=-30;
    if (x > y) {
        printf("%d > %d\n", x, y);
    } else {
        printf("%d <= %d\n", x, y);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用GCC 4.2.1进行编译如下所示在控制台上没有输出:

gcc -Werror -Wall -Wextra -pedantic foo.c -o foo
Run Code Online (Sandbox Code Playgroud)

生成的可执行文件生成以下输出:

$ ./foo
20 <= -30
Run Code Online (Sandbox Code Playgroud)

在将有符号值分配给-30无符号整数变量时,是否有某些原因导致GCC不生成任何警告或错误消息y

c unsigned gcc gcc-warning

14
推荐指数
2
解决办法
3954
查看次数

我应该何时使用std_logic_vector,何时应该使用其他数据类型?

我是VHDL的新手,我很难搞清楚哪些数据类型适合在哪里使用.如果我理解正确,对于综合,所有顶级实体端口都应该声明为std_logic_vector或std_logic,而不是任何其他类型.

但是std_logic_vector不支持算术,所以我应该如何处理呢?

我的直觉告诉我,我应该在顶层使用std_logic_vector,然后在将其传递给其他实体时将其转换为整数数据类型.它是否正确?

什么积分数据类型(整数,无符号,有符号)应该在哪里使用?我理解有符号和无符号之间的区别,但什么时候应该使用整数?

port unsigned signed integer vhdl

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

将负值分配给unsigned int时会发生什么?

可能重复:
在C中签名为无符号转换 - 它总是安全吗?

假设我声明了unsigned int类型的变量: unsigned int x = -1;

现在-1的二进制补码(假设32位机器)为0xFFFFFFFF.现在,当我将此值赋给x时,值0x7FFFFFFF是否已分配给x?

如果是这样,则printf("%d",x); 会打印十进制等效的0x7FFFFFFF,对吧?但是,显然这没有发生,因为打印的值是-1.我在这里错过了什么?

编辑:我知道我们可以使用%u格式说明符来打印无符号值.但这无助于回答上述问题.

c unsigned

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

Java中的Unsigned Int

我正在尝试实现现有的网络协议,该协议大量使用Java不支持的无符号数据类型.我目前所做的是针对每种数据类型,选择下一个较大的数据类型,以便无符号数可以适合正区域,然后使用字节移位来获得所需的效果.由于这是非常容易出错的,并且对于无符号长的向前我必须使用比扩展类型重得多的BigInteger,我想知道是否有更好的方法来实现这一点?

java networking unsigned protocols

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

C#相当于64位无符号长整型C++

我正在构建一个将由C++使用COM的DLL.请让我知道C++ 64位无符号long long的C#等价物.

它会是C#中的ulong类型吗?请确认.

谢谢,Gagan

c# c++ unsigned ulong long-integer

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

什么应该发生在size_t的否定(即`-sizeof(struct foo)`))?

我正在处理一些包含表单表达式的代码

-(sizeof(struct foo))
Run Code Online (Sandbox Code Playgroud)

即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?

编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?

c c++ unsigned sizeof size-t

12
推荐指数
1
解决办法
2291
查看次数

使用%u和C中的%d打印内存地址之间的区别?

我读了一本C书.要打印出变量的内存地址,有时书籍会使用:

printf("%u\n",&n);
Run Code Online (Sandbox Code Playgroud)

有时,作者写道:

printf("%d\n",&n);
Run Code Online (Sandbox Code Playgroud)

结果总是一样,但我不明白两者之间的差异(我知道%u表示无符号).

有人可以详细说明吗?

非常感谢.

c unsigned

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

无符号减去32和64位之间的无符号差

情况:
我有一段代码在编译为32位时有效,但在使用gcc 4.6编译为64位时失败.在确定问题并阅读标准后,我无法理解为什么它适用于32位.我希望有人能解释发生了什么.

代码(稍微简化并减少到有趣的部分):

// tbl: unsigned short *, can be indexed with positive and negative values
// v: unsigned int
// p: unsigned char *
tmp = tbl[(v >> 8) - p[0]]; // Gives segfault when not compiled with -m32
Run Code Online (Sandbox Code Playgroud)

-m32代码编译时编译.在没有-m32它的情况下进行编译会产生段错误.segfault的原因是(v >> 8) - p[0]被解释unsigned int为64位编译时,"负"结果将被关闭.

根据这个问题,C99标准说明如下:
6.2.5c9:A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type …

c unsigned gcc 32bit-64bit

12
推荐指数
1
解决办法
1773
查看次数

为什么std :: abs返回签名类型

当我比较一个std::abs(int)和一个时,我正在收到有关签名与无签名比较的警告unsigned.事实上,std::abs返回签署的值.为什么选择这个?它将解决负值的问题,其绝对值不能用有符号的类型表示.

然后,是否有比这更清洁(即没有演员表)的东西以避免警告?

#include <cassert>
#include <cstdlib>

// max(1, lhs + rhs). (lhs must be > 0)
unsigned add(unsigned lhs, int rhs)
{
  return
    (0 < rhs || static_cast<unsigned>(-rhs) < lhs
     ? rhs + lhs
     : 1);
}

int main()
{
  assert(add(42, -41) == 1);
  assert(add(42, 0) == 43);
  assert(add(42, 1) == 43);
  assert(add(42, -51) == 1);
}
Run Code Online (Sandbox Code Playgroud)

c++ unsigned signed gcc-warning

12
推荐指数
1
解决办法
1501
查看次数

为什么(18446744073709551615 == -1)是真的?

当我在工作时,string::npos我注意到了一些东西,我在网上找不到任何解释.

(string::npos == ULONG_MAX)
Run Code Online (Sandbox Code Playgroud)

(string::npos == -1)
Run Code Online (Sandbox Code Playgroud)

是真的.

所以我尝试了这个:

(18446744073709551615 == -1)
Run Code Online (Sandbox Code Playgroud)

这也是事实.

怎么可能?是因为二元对话吗?

c++ unsigned signed equality integer-overflow

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