为了表示长度或计数变量,使用有符号或无符号整数是否更好?
在我看来,C++ STL往往更喜欢无符号(std::size_t就像在std :: vector :: size()中一样,而C#BCL往往更喜欢有符号整数(比如在ICollection.Count中).
考虑到长度或计数是非负整数,我的直觉会选择无符号 ; 但我不明白为什么.NET设计者选择了有符号整数.
什么是最好的方法?每个人的利弊是什么?
在阅读了有关签名/未签名比较的问题之后(我每隔几天就会说出来):
我想知道为什么我们没有正确的签名无符号比较,而是这个可怕的混乱?从这个小程序中获取输出:
#include <stdio.h>
#define C(T1,T2)\
{signed T1 a=-1;\
unsigned T2 b=1;\
printf("(signed %5s)%d < (unsigned %5s)%d = %d\n",#T1,(int)a,#T2,(int)b,(a<b));}\
#define C1(T) printf("%s:%d\n",#T,(int)sizeof(T)); C(T,char);C(T,short);C(T,int);C(T,long);
int main()
{
C1(char); C1(short); C1(int); C1(long);
}
Run Code Online (Sandbox Code Playgroud)
用我的标准编译器(gcc,64bit)编译,我得到这个:
char:1
(signed char)-1 < (unsigned char)1 = 1
(signed char)-1 < (unsigned short)1 = 1
(signed char)-1 < (unsigned int)1 = 0
(signed char)-1 < (unsigned long)1 = 0
short:2
(signed short)-1 < (unsigned char)1 = 1
(signed short)-1 < (unsigned short)1 = 1
(signed short)-1 < …Run Code Online (Sandbox Code Playgroud) 鉴于有符号和无符号整数使用相同的寄存器等,并且只是不同地解释位模式,而C字符基本上只是8位整数,C中有符号和无符号字符之间的区别是什么?我理解char的签名是实现定义的,我根本无法理解它是如何产生影响的,至少当char用于保存字符串而不是数学时.
我认为((1 ? (int)1 : (unsigned int)2) > -1)结果是1(true),但实际上它0在Visual Studio 2017中是(假的).
我认为价值(1 ? (int)1 : (unsigned int)2)应该是(int)1,因为1 ?是真的,而且1 > -1是真的.
我不知道为什么这个表达式的最终结果是错误的.
当我尝试转换时((int)(1 ? (int)1 : (unsigned int)2) > -1),它返回1(true).
signed int test = -1;
signed int si = 1;
unsigned int ui = 2;
printf("%d\n", ((1 ? si : ui) > test));
return 0;
Run Code Online (Sandbox Code Playgroud)
我希望输出是1,但实际输出是0.
C17 6.2.6.2/4说:
如果实现不支持负零,则未定义&,|,^,〜,<<和>>运算符的行为,其操作数会产生这样的值。
如果我有一个2的补码系统,则它不支持负零。并且它始终利用二进制数的所有可能组合来表示一个值。因此,无论使用哪种按位运算,都不可能产生负零。那么这段文字是什么意思呢?
我认为这部分是指具有1的补码或带符号幅度的系统,该系统不支持负零,而是使用填充位或陷阱表示。它是否正确?
根据C/C++标准(参见此链接),C和C++中的>>运算符不一定是有符号数的算术移位.由于位向右移位,所以由编译器实现是0(逻辑)还是符号位(算术)移入.
对于为有符号整数实现逻辑右移的编译器,此代码是否会在编译时对ASSERT(fail)起作用?
#define COMPILE_TIME_ASSERT(EXP) \
typedef int CompileTimeAssertType##__LINE__[(EXP) ? 1 : -1]
#define RIGHT_SHIFT_IS_ARITHMETIC \
( (((signed int)-1)>>1) == ((signed int)-1) )
// SHR must be arithmetic to use this code
COMPILE_TIME_ASSERT( RIGHT_SHIFT_IS_ARITHMETIC );
Run Code Online (Sandbox Code Playgroud) 我在Android Studio中并在Build> Generate Signed APK和使用向导下签署APK.一切似乎都很好,并生成.apk文件.
当我将此文件复制到我的设备(Nexus 7或Moto X)时,它将无法安装.我收到"安装失败"消息.
我无法弄清楚到底出了什么问题.我把这个.apk放在谷歌游戏开发者控制台的"alpha测试"下,它被接受了(我正在等待测试人员链接变得活跃,尝试从那里下载/安装).
这里向导的说明(http://developer.android.com/tools/publishing/app-signing.html#studio)在最后阶段的屏幕截图中显示了一个名为"Build Type"的下拉列表,选择为"release" .我在我的Android Studio版本中没有这个.我在这个向导中找不到任何可以指定"发布"版本的东西.
任何人都可以给我的任何帮助将非常感激.谢谢!
用户正在运行从浏览器启动的JNLP应用程序.JNLP启动的*.jar文件由受信任的CA颁发的证书签名.
启动jar文件时,会向用户询问是否信任签名者(不是CA - CA已经信任).
如果用户说"是",则将签名者的证书添加到信任存储区.
问题是:同一个对话框再次显示的条件是什么?
即使在用户最初选中" 不再显示此项 "复选框后,其中哪些(或其他?)将触发对话框显示?
此声明在g ++ -pedantic -Wall(版本4.6.3)中编译时没有警告:
std::size_t foo = -42;
Run Code Online (Sandbox Code Playgroud)
不太明显的伪造是使用size_t参数声明一个函数,并使用负值调用它.这样的功能可以防止无意中的负面论证(看起来像是无数的庸俗,遵守§4.7/ 2)吗?
答案不完整:
只需将size_t更改为(signed)long就会丢弃size_t的语义和其他优点.
将其更改为ssize_t仅仅是POSIX,而不是标准.
将它改为ptrdiff_t是脆弱的,有时会破坏.
测试巨大的值(高位设置等)是任意的.
32位有符号整数的最小值是什么,恰好是在[本网站]创建帐户的安全性"挑战"问题(编辑:链接现在是恶意软件)(不要判断我只是好奇和无聊).
我以为他们说的是一个典型的32位int,它可以存储大到的数字2,147,483,647.但是,当我尝试-2147483647它时,我说错了.我尝试了几种变体,-2,147,483,647但没有任何作用......
我是否误解了这个问题,或者网站有什么问题吗?
PS我也按照建议尝试了-2,147,483,648
这是一张照片
