本网站上的几个问题揭示了混合有符号和无符号类型时的缺陷,大多数编译器似乎都很好地生成了这种类型的警告.但是,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?
我是VHDL的新手,我很难搞清楚哪些数据类型适合在哪里使用.如果我理解正确,对于综合,所有顶级实体端口都应该声明为std_logic_vector或std_logic,而不是任何其他类型.
但是std_logic_vector不支持算术,所以我应该如何处理呢?
我的直觉告诉我,我应该在顶层使用std_logic_vector,然后在将其传递给其他实体时将其转换为整数数据类型.它是否正确?
什么积分数据类型(整数,无符号,有符号)应该在哪里使用?我理解有符号和无符号之间的区别,但什么时候应该使用整数?
可能重复:
在C中签名为无符号转换 - 它总是安全吗?
假设我声明了unsigned int类型的变量: unsigned int x = -1;
现在-1的二进制补码(假设32位机器)为0xFFFFFFFF.现在,当我将此值赋给x时,值0x7FFFFFFF是否已分配给x?
如果是这样,则printf("%d",x); 会打印十进制等效的0x7FFFFFFF,对吧?但是,显然这没有发生,因为打印的值是-1.我在这里错过了什么?
编辑:我知道我们可以使用%u格式说明符来打印无符号值.但这无助于回答上述问题.
我正在尝试实现现有的网络协议,该协议大量使用Java不支持的无符号数据类型.我目前所做的是针对每种数据类型,选择下一个较大的数据类型,以便无符号数可以适合正区域,然后使用字节移位来获得所需的效果.由于这是非常容易出错的,并且对于无符号长的向前我必须使用比扩展类型重得多的BigInteger,我想知道是否有更好的方法来实现这一点?
我正在构建一个将由C++使用COM的DLL.请让我知道C++ 64位无符号long long的C#等价物.
它会是C#中的ulong类型吗?请确认.
谢谢,Gagan
我正在处理一些包含表单表达式的代码
-(sizeof(struct foo))
Run Code Online (Sandbox Code Playgroud)
即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?
编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?
我读了一本C书.要打印出变量的内存地址,有时书籍会使用:
printf("%u\n",&n);
Run Code Online (Sandbox Code Playgroud)
有时,作者写道:
printf("%d\n",&n);
Run Code Online (Sandbox Code Playgroud)
结果总是一样,但我不明白两者之间的差异(我知道%u表示无符号).
有人可以详细说明吗?
非常感谢.
情况:
我有一段代码在编译为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 …
当我比较一个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) 当我在工作时,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)
这也是事实.
怎么可能?是因为二元对话吗?
unsigned ×10
c ×5
c++ ×4
signed ×3
gcc ×2
gcc-warning ×2
32bit-64bit ×1
c# ×1
equality ×1
integer ×1
java ×1
long-integer ×1
networking ×1
port ×1
protocols ×1
size-t ×1
sizeof ×1
ulong ×1
vhdl ×1