我正在学习Haskell,并希望在一些构造函数中强制使用正整数(1,2,3,...),但我似乎只能找到'Int'和'Integer'数据类型.
我可以使用规范
data Nat = Zero | Succ Nat
Run Code Online (Sandbox Code Playgroud)
但后来我不能用1,4,......来表示它们.
所以我问,有没有办法实现这个目标?(就像在C中使用'unsigned')
提前致谢.
编辑:正如CA McCann所解释的那样,我将把它隐藏在一个模块中.另外,我必须添加以下链接: http: //haskell.org/haskellwiki/Smart_constructors以获取有关该主题的摘要.感谢您抽出宝贵时间回答!
如果lv存储一个long值,并且机器是32位,则代码如下:
iv = int(lv & 0xffffffff)
Run Code Online (Sandbox Code Playgroud)
结果是类型为long的iv,而不是机器的int.
在这种情况下如何获得(带符号)int值?
以下面的C代码为例:
int main(int argc, char *argv[])
{
signed char i;
unsigned char count = 0xFF;
for (i=0; i<count;i++)
{
printf("%x\n", i);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码在无限循环中运行,即使我按如下方式编译它:
# gcc -Wall -Wpedantic -Wconversion -Wsign-compare -Wtype-limits -Wsign-conversion test.c -o test
Run Code Online (Sandbox Code Playgroud)
有人知道应该警告这些问题的编译器标志吗?
为了清楚起见,我不是在问'为什么会得到一个无限循环',而是要知道是否有办法使用编译器或静态分析来阻止它?
为了表示长度或计数变量,使用有符号或无符号整数是否更好?
在我看来,C++ STL往往更喜欢无符号(std::size_t就像在std :: vector :: size()中一样,而C#BCL往往更喜欢有符号整数(比如在ICollection.Count中).
考虑到长度或计数是非负整数,我的直觉会选择无符号 ; 但我不明白为什么.NET设计者选择了有符号整数.
什么是最好的方法?每个人的利弊是什么?
我需要打印一个ULONGLONG值(unsigned __int64).我应该使用什么格式printf?我%llu在另一个问题中找到了,但他们说它只适用于linux.
谢谢你的帮助.
-1可以用4位二进制表示为(2的补码)1111
图15也表示为1111.
那么,当CPU从内存中获取值时,CPU如何区分15和-1?
C标准规定:
ISO/IEC 9899:1999,6.2.5.15(第49页)
char,signed char和unsigned char这三种类型统称为字符类型.实现应将char定义为具有与signed char或unsigned char相同的范围,表示和行为.
确实gcc根据目标平台定义.
我的问题是,为什么标准会这样做?除了可怕的和难以发现的错误之外,我看不出任何可能来自模糊类型定义的内容.
更重要的是,在ANSI C(C99之前)中,唯一的字节大小类型是char,因此使用char进行数学运算有时是不可避免的.所以说"一个人永远不应该使用char来表示数学"并非如此.如果是这样的话,一个理智的决定是包括三种类型" ,".charubytesbyte
有没有理由,或者它只是一些奇怪的向后兼容性问题,以便将坏(但常见)编译器定义为标准兼容?
在阅读了有关签名/未签名比较的问题之后(我每隔几天就会说出来):
我想知道为什么我们没有正确的签名无符号比较,而是这个可怕的混乱?从这个小程序中获取输出:
#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) 视频"江南风格"(我相信你已经听过)在youtube上的视图超过了20亿.事实上,谷歌表示,他们从未预料到视频会超过32位整数......这暗示谷歌使用的是视频 int 而不是unsigned视频.我认为他们必须重新编写代码以适应更大的视图.
检查他们的风格指南:https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Integer_Types
......他们建议"不要使用无符号整数类型",并给出一个很好的理由:unsigned可能是错误的.
这是一个很好的理由,但可以防范.我的问题是:一般来说编码练习是不是很糟糕unsigned int?