我所知道的unsigned数字(unsigned short,int和longs),它只包含正数,但是下面的简单程序成功地将一个负数分配给unsigned int:
1 /*
2 * =====================================================================================
3 *
4 * Filename: prog4.c
5 *
6 * =====================================================================================
7 */
8
9 #include <stdio.h>
10
11 int main(void){
12
13 int v1 =0, v2=0;
14 unsigned int sum;
15
16 v1 = 10;
17 v2 = 20;
18
19 sum = v1 - v2;
20
21 printf("The subtraction of %i from %i is %i \n" , v1, v2, sum);
22
23 return 0;
24 }
Run Code Online (Sandbox Code Playgroud)
输出是:
The subtraction of …
我在这个网站上搜索了一个答案,发现许多对未签名/签名比较的回复,但是这个问题是只比较了无符号参数,但它仍然很有趣.
以下代码的问题在于第一个if-statment不会发生("hello"),而第二个("world")就是这样.我已经解释为在if-statment 内部进行的计算会生成一个负数但是保存到变量的结果完全相同的计算不会(即使结果被保存到有符号变量).
使用的编译器是gcc 4.4.
unsigned short u16_varHigh;
unsigned short u16_varLow;
unsigned short u16_Res1;
signed short s16_Res1;
u16_varHigh = 0xFFFF;
u16_varLow = 10;
u16_Res1 = u16_varLow - u16_varHigh; // response is 11 as expected
s16_Res1 = u16_varLow - u16_varHigh; // response is 11 as expected
// Does not enter
if( (u16_varLow - u16_varHigh) > (unsigned short)5 )
{
printf( "hello" );
}
// Does enter
if( (unsigned short)(u16_varLow - u16_varHigh) > 5 )
{
printf( "world" …Run Code Online (Sandbox Code Playgroud) 我想在模板中使用unsigned T:
template<class T>
void signed2unsigned(const T* source, unsigned T* dest, size_t n)
{
do
{
intmax_t s=*source;
s+=min(*source);
*dest=s;
++dest;
++source;
--n;
}
while(n!=0);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为在考虑类型T之前,unsigned without扩展为unsigned int.是否有一个解决方法,只是介绍U并写入文档,U必须是一个无符号T?
C和C++是否保证类型的无符号等价物具有相同的大小?
例:
size_t size = sizeof(unsigned int);
Run Code Online (Sandbox Code Playgroud)
在unsigned这里完全实际意义?
我正在使用Visual Studio 2013.
最近我尝试了~运算符1的补码:
int a = 10;
cout << ~a << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 -11
但对于
unsigned int a = 10;
cout << ~a << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 4294967296
我不明白为什么输出是-11签名的情况int.请帮我解决这个困惑.
我想分配4294967295给一个变量(2^32-1)很明显,我不能这样做Integer,并且可以做到Long.
但是,我注意到Java 8提供了无符号整数(至少某些方法).
有人知道方法Integer.parseUnsignedInt()是什么吗?当我输入"4294967295"它并打印变量时,它将输出为-1
(-2for 4294967294,-3for 4294967293等等......)
有没有一种方法可以4294967295在变量中使用?
我在这里错过了什么吗?
a=Integer.parseUnsignedInt("4294967295");
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
这给出了输出,-1但我预计4294967295.
我发现 和 都mul可以imul用来将有符号数乘以无符号数。
例如:
global _start
section .data
byteVariable DB -5
section .text
_start:
mov al, 2
imul BYTE [byteVariable]
Run Code Online (Sandbox Code Playgroud)
可以用 替换imul,mul结果还是一样(-10)。
将有符号数与无符号mul数相乘时和imul完全相同,还是有区别?
我知道u后缀的意思是“未签名”。但是以下代码中有必要吗?
uint32_t hash = 2166136261u;
Run Code Online (Sandbox Code Playgroud)
是问题还是惯例?还是在这种情况下有任何技术意义?该值无论如何都应转换为无符号,因为它uint32_t是无符号的。
什么时候应该,什么时候不应该将u后缀用于无符号整数值?
我很好奇为什么存在 signed 关键字,因为我相信大多数整数和其他变量在默认情况下都是有符号的。将 signed 关键字放在 int 之前几乎没有任何作用。它有什么用途,为什么存在?
标准 C++ 中是否有 size_t 的有符号变体?意味着与 size_t 完全相同的位大小,但有符号。
我当然可以这样做:
#include <type_traits>
using signed_size_t = std::make_signed_t<std::size_t>;
Run Code Online (Sandbox Code Playgroud)
但也许标准库中已经有类似的定义,而不是发明额外的类型名称?
我知道有 ssize_t 和 ptrdiff_t,都有签名。但根据他们的描述,它们似乎都可以具有与 size_t 不同的位大小。但我需要与 size_t 完全相同的位大小,但已签名。